gpt4 book ai didi

asp.net-mvc - 带有 IoC 的存储库模式 - 它应该如何正确使用?

转载 作者:行者123 更新时间:2023-12-01 08:09:54 24 4
gpt4 key购买 nike

我是一个孤独的开发人员,Pluralsight 是我的救星,它帮助我理解了 Repository 和 IoC 等我刚刚学习的东西。
但是我发现这种模式使用起来很尴尬。

所以我使用 Unity IoC,并关注 ModelContainer类(class);

public static class ModelContainer
{
private static IUnityContainer instance;

static ModelContainer()
{
instance = new UnityContainer();
}

public static IUnityContainer Instance
{
get
{
instance.RegisterType<ISCD_CallDiaryRepository, SCD_CallDiaryRepository>(new HierarchicalLifetimeManager());
instance.RegisterType<ICompanyRepository, CompanyRepository>(new HierarchicalLifetimeManager());
instance.RegisterType<ISubcontractorRepository, SubcontractorRepository>(new HierarchicalLifetimeManager());
instance.RegisterType<ITradeRepository, TradeRepository>(new HierarchicalLifetimeManager());
instance.RegisterType<IEmployeeRepository, EmployeeRepository>(new HierarchicalLifetimeManager());
instance.RegisterType<ISubcontractorTradeRepository, SubcontractorTradeRepository>(new HierarchicalLifetimeManager());
instance.RegisterType<ICountyRepository, CountyRepository>(new HierarchicalLifetimeManager());
instance.RegisterType<IAddressLineRepository, AddressLineRepository>(new HierarchicalLifetimeManager());
return instance;
}
}
}

允许我在 Controller 的构造函数中实例化存储库类;
public SubcontractorController(
ISubcontractorRepository subcontractorRepository,
ISubcontractorTradeRepository subcontractorTradeRepository,
ICompanyRepository companyRepository,
ISCD_CallDiaryRepository scdCallDiaryRepository,
ITradeRepository tradeRepository,
IAddressLineRepository addressLineRepository)
{
this.SubcontractorRepository = subcontractorRepository;
this.SubcontractorTradeRepository = subcontractorTradeRepository;
this.CompanyRepository = companyRepository;
this.ScdCallDiaryRepository = scdCallDiaryRepository;
this.TradeRepository = tradeRepository;
this.AddressLineRepository = addressLineRepository;
}

我觉得这个设置很尴尬的是,如果我想在这些存储库类中使用 CRUD 功能,我必须在 Controller 中执行该功能,或者将我创建的存储库实例作为参数传递给模型类方法。我选择后者, Controller 并不意味着做太多事情,但对我来说,必须不断传递存储库参数似乎是不对的。

我错过了什么?

最佳答案

在提供的样本中,有 SubcontractorController带有 的 Controller 六个依赖 ,这通常意味着 Controller 试图一次做太多事情,并且可能违反单一责任原则。至少有三种改善情况的方法:

  • 无需将存储库注入(inject) Controller ,并将存储库实例作为参数传递给模型类方法,您可以 refactor to Aggregate Services ,即在单个实体中结合模型方法和依赖项。这也将解决构造函数过度注入(inject)。
  • 将存储库工厂注入(inject) Controller ,然后使用此工厂解决依赖关系
  • 自己注入(inject)模型,并使存储库成为它们的依赖项。
  • 关于asp.net-mvc - 带有 IoC 的存储库模式 - 它应该如何正确使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14454027/

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