gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:16:57 28 4
gpt4 key购买 nike

嗨我正在尝试根据 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; }}

现在我想用创建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. 也许这个问题有更好的解决方案。

最佳答案

重写你的 ItemFactory使用依赖注入(inject)并注入(inject) IRepository<Category>使用构造函数注入(inject)。这样做之后,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 的类型执行相同的操作.注入(inject) ItemFactory作为这些类型的构造函数中的依赖项。一直执行此操作直到应用程序的类型层次结构的顶部并组成它们的类型(composition root)。

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

关于c# - 如何在工厂中使用存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4431937/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com