Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在工厂中使用存储库_C#_Domain Driven Design_Repository_Factory - Fatal编程技术网

C# 如何在工厂中使用存储库

C# 如何在工厂中使用存储库,c#,domain-driven-design,repository,factory,C#,Domain Driven Design,Repository,Factory,嗨 我正试图根据DDD提出申请。我有以下实体: public class Item { public Category Category { get; protected set; } ... } public class SpecificItem : Item { ... } public class Category { public static int IdOfCategoryForSpecificItem = 10;

嗨 我正试图根据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; } } 公共类项目 { 公共类别类别{get;protected set;} ... } 公共类特定项:项 { ... } 公共类类别 { 公共静态int IDOFCATEGORYFORSPECITICITEM=10; 公共int Id{get;set;} } 现在我想创建工厂,方法是创建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 }; } }
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
        };
    }
}
公共类项目工厂 { 公共静态SpecificItem CreateSpecificItem(对象参数) { IRepository repository=null//如何获取存储库? 返回新的特定项目 { Category=repository.FirstOrDefault(i=>i.Id==Category.IdOfCategoryForSpecificItem), //附加初始化 }; } } 现在我的问题是:

  • 这是创建工厂和使用存储库的正确方法吗
  • 如何获取存储库?我不能使用DI,因为它是静态方法。我不喜欢ServiceLocator,因为它很难进行单元测试
  • 也许有更好的办法解决这个问题

  • 重写
    ItemFactory
    以使用依赖项注入,并使用构造函数注入注入
    ireposition
    。执行此操作后,
    ItemFactory
    将如下所示:

    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 }; } }
    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
            };
        }
    }
    
    公共类ItemFactory
    {
    私有只读存储库;
    公共项目工厂(IRepository存储库)
    {
    this.repository=存储库;
    }
    public SpecificItem CreateSpecificItem(对象参数)
    {
    返回新的特定项目
    {
    Category=this.repository.FirstOrDefault(i=>
    i、 Id==Category.IDOFCategoryForSpecificiItem),
    //附加初始化
    };
    }
    }
    
    通过这种方式,您将检索
    irepositional
    实现的责任转移给了调用者。现在,您可以对需要
    ItemFactory
    的所有类型执行相同的操作。将
    ItemFactory
    作为依赖项注入这些类型的构造函数中。一直到应用程序的类型层次结构的顶部,并将类型组合到它们的类型层次结构中


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

    我认为这是对语法的困惑导致您找到更好的解决方案的时候之一

    似乎您可能希望每个类都有一个不同的存储库,这正是DI可以为您做的,并且静态属性可以阻止它

    但我也认为你在这里混淆了你的名字——工厂创建某种类型的新项目,而回复存储/保存这种类型的项目。您正在创建还是检索


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

    我建议开设Dao服务类。当Dao组织对数据的访问时,服务使用Dao来管理数据。模式为:
    1) Dao类正在访问数据
    2) 服务类正在形成存储库
    3) 为工厂提供存储库的服务类

    这是一个非常通用的模式,但我希望我的回答能对您有所帮助。

    我唯一关心的是,至少在DDD意义上,类别似乎不应该有一个存储库,因为它不为聚合根提供持久性服务。但是,在ORM级别使用存储库可能是有意义的,因为至少据我所知,工厂实现仍然被视为应用程序基础架构。是否应将
    IRepository
    设置为不可变?如果不是,那么工厂将为相同的参数生成不同的结果。