C# 如何在工厂中使用存储库
嗨 我正试图根据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 }; } }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;
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),
//附加初始化
};
}
}
现在我的问题是:
重写
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
设置为不可变?如果不是,那么工厂将为相同的参数生成不同的结果。