如何在工厂中使用存储库

Sła*_*iek 4 c# domain-driven-design factory repository

嗨,我正在尝试按照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; }
}

现在我想用创建ObjectItem类型对象的方法创建工厂.但是这个特定项目必须属于特定类别.所以我创建了这样的工厂:

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. 也许这个问题有更好的解决方案.

Ste*_*ven 10

重写你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
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

这样您就可以将检索实现的责任转移IRepository<Category>给调用者.现在,您可以对需要的所有类型执行相同操作ItemFactory.ItemFactory在这些类型的构造函数中注入as依赖项.这样做一直到应用程序的类型层次结构的顶部,并组成他们的类型(组合根).

特别是IoC/DI框架将非常方便为您自动创建类型.