DI: Связывание сущностей с хранилищем - PullRequest
3 голосов
/ 30 марта 2011

Я довольно новичок в этой концепции.Я пытаюсь создать фабрику, которая будет возвращать объект, который используется для функций репозитория.Там нет проблем.Поэтому я создаю экземпляр конкретной фабрики в main () и сохраняю его в статическом свойстве App, но мои сущности находятся в отдельной dll.Имеет ли смысл передавать хранилище каждому классу сущностей в конструкторе?Это не правильно.Мой вопрос: как лучше всего заставить мои сущности знать, какой репозиторий они должны использовать?

Мой частичный класс приложения выглядит как

public partial class App : Application
{
 private static ICalDataAccess _daqFactory;

 public static ICalDataAccess DataAccessFactory
 {
   set { _daqFactory = value; }
   get { return _daqFactory; }
 }
}

Возможно, немного больше кода в порядке.

public class Widget
{
    public string Description { get; set; }
    public int ID { get; set; }

    private IWidgetRepository _widgetRepository;
    public Widget(IWidgetRepository WidgetRepository)
    {
        _widgetRepository = WidgetRepository;
    }

    public void Save()
    {
        _widgetRepository.Save(this);
    }
}

Я делаю здесь что-нибудь вопиющее?

Ответы [ 2 ]

3 голосов
/ 30 марта 2011

Я думаю, что общая рекомендация состоит в том, чтобы ваши организации были свободны от постоянных забот. То есть у вас есть некоторый код, который извлекает сущности и использует их для выполнения любой необходимой работы, что приводит к появлению новых, удаленных или измененных сущностей, которые вызывающий код затем передает в соответствующий репозиторий (или запрашивает сохранение, если вы иметь что-то, что отслеживает или обнаруживает измененные объекты, такие как EF или NHibernate).

Таким образом, ваши сущности вообще не должны знать о репозиториях.

Я обычно создаю вспомогательный класс UnitOfWork, который предоставляет все мои репозитории через свойство "public RepositoryFactory Repositories {get;}", так что, просто предоставив экземпляр класса UnitOfWork, я получу доступ ко всем моим источникам данных. UnitOfWork затем может быть введен через IoC в любой класс, которому требуется доступ к данным.

Некоторые рекомендуют прочитать по этой теме:

0 голосов
/ 30 марта 2011

Ваше описание больше похоже на шаблон поиска сервисов, чем на внедрение зависимостей. Внедрение зависимостей обычно выглядит как любой объект, которому для выполнения своей работы требуется какой-либо объект службы (например, доступ к данным), который получает эту службу в качестве параметра для своего конструктора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...