繁体   English   中英

如何在工厂中使用存储库

[英]How to use repository in factory

嗨,我正在尝试按照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. 也许这个问题有更好的解决方案。

重写您的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 在这些类型的构造函数中将ItemFactory注入为依赖项。 这样做一直到应用程序的类型层次结构的顶部,并组成他们的类型( 组合根 )。

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

我建议制作DaoService课程。 当Dao组织对数据的访问时,Service使用Dao来管理数据。 架构是:
1)Dao-class正在访问数据
2)服务类正在形成存储库
3)服务级为您的工厂提供存储库
这是非常通用的架构,但我希望我的回答能帮到你。

我认为这是一个令人费解语法的时代正在引导您走向更好的解决方案。

您可能希望每个类都有一个不同的存储库,这正是DI可以为您做的以及静态属性将阻止的。

但我也认为你在这里混淆了你的名字 - 一个工厂创造了某种类型的新物品,而一个工厂存储/持久存储该类型的物品。 你在创建还是检索?

我的建议是将它们分开 - 实现一个工厂来创建新工厂和一个存储库来保存/检索现有工厂。 使用DI根据运行时的类型确定哪种具体实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM