Как использовать репозиторий на фабрике - PullRequest
4 голосов
/ 13 декабря 2010

Привет Я пытаюсь подать заявку в соответствии с DDD. У меня есть следующие лица:


public class Item 
{
       public Category Category { get; protected set; }

       ...
}

public class SpecificItem : Item
{
       ...
}

public class Category 
{
       public static int IdOfCategoryForSpecificItem = 10;

       public int Id { get; set; }
}

А теперь я хотел бы создать factory с методом, который создает объект типа SpecificItem Но этот конкретный предмет должен быть в определенной категории. Итак, я создал фабрику так:

public class ItemFactory
{
       public static SpecificItem CreateSpecificItem(object someArguments)
       {
            IRepository<Category> repository = null // How to get repository?

            return new SpecificItem
            {
                 Category = repository.FirstOrDefault(i => i.Id == Category.IdOfCategoryForSpecificItem),
                 // additional initialization
            };
       }
}

А теперь мои вопросы:

  1. Это верный способ создать фабрику и использовать репозиторий?
  2. Как получить хранилище? Я не могу использовать DI, потому что это статический метод. Мне не нравится ServiceLocator, потому что это сложно для модульного тестирования.
  3. Возможно, есть более подходящие решения для этой проблемы.

Ответы [ 3 ]

9 голосов
/ 13 декабря 2010

Перепишите ваш ItemFactory, чтобы использовать внедрение зависимостей, и введите IRepository<Category>, используя конструктор.После этого ItemFactory будет выглядеть следующим образом:

public class ItemFactory
{
    private readonly IRepository<Category> repository;

    public ItemFactory(IRepository<Category> repository)
    {
        this.repository = repository;
    }

    public SpecificItem CreateSpecificItem(object someArguments)
    {
        return new SpecificItem
        {
             Category = this.repository.FirstOrDefault(i => 
                 i.Id == Category.IdOfCategoryForSpecificItem),
             // additional initialization
        };
    }
}

Таким образом, вы переместили ответственность за получение реализации IRepository<Category> на вызывающую сторону.Теперь вы можете сделать то же самое для всех типов, которым требуется ItemFactory.Вставьте ItemFactory как зависимость в конструкторы этих типов.Сделайте это до самой вершины иерархии типов вашего приложения и составьте типы их ( составной корень ).

Особенно платформы IoC / DI очень пригодятся для автоматизации созданиятипов для вас.

1 голос
/ 13 декабря 2010

Я предлагаю сделать Дао и Сервис классов.В то время как Dao организует доступ к данным, Service использует Dao для управления данными.Схема:
1) Дао-класс получает доступ к данным
2) Сервис-класс формирует хранилище
3) Сервис-класс предоставляет хранилище для вашей фабрики
Это очень обобщенная схема, но я надеюсь, что мой ответ поможет вам.

0 голосов
/ 13 декабря 2010

Я думаю, что это один из тех случаев, когда недоумение по поводу синтаксиса ведет вас к лучшему решению.

Кажется вероятным, что вам может потребоваться отдельный репозиторий для каждого класса, что и делает DI.для вас, и какое статическое свойство помешает.

Но я также думаю, что вы путаете здесь свои имена - фабрика создает НОВЫЕ элементы какого-либо типа, в то время как хранилище хранит / сохраняет элементы этого типа.Вы создаете или восстанавливаете?

Я предлагаю разделить их - внедрить фабрику для создания новых и репозиторий для сохранения / восстановления существующих.Используйте DI, чтобы решить, какая конкретная реализация основана на типе во время выполнения.

...