gpt4 book ai didi

c# - nTier + 运行时解析中的依赖注入(inject)

转载 作者:太空宇宙 更新时间:2023-11-03 17:04:00 25 4
gpt4 key购买 nike

我一直在阅读依赖注入(inject)(Mark Seemann: Dependency Injection in .NET 和各种文章)以帮助我的团队开发基于 EntityFramework、WCF 和 WPF 的新 3 层应用程序。

我假设我们的每一层都需要一个组合根,因为它们通过服务进行通信(DAL <-> WCF <-> BL <-> WCF < -> PL/UI)。

我们的一个要求是我们需要动态加载和配置 EF,以便我们可以在应用程序部署后更改/扩展我们的模型。

在不详细介绍我们的 BL --> PL/UI 实现的情况下,让我们关注通过自定义 serviceHost 后面的 EntityService 公开的 DAL。我们的项目有一个简单的例子,布局如下:

项目.DataModel

  • 单个程序集
  • 硬引用:无
  • 运行时分辨率:无
  • 一个提供抽象类和数据建模接口(interface)的公共(public)库。即EntityData抽象类

Project.DataModel.[?]Data

  • 许多程序集:即 CityData、CustomerData 等
  • 硬引用:Project.DataModel
  • 运行时分辨率:无
  • 定义基于 EntityData 的单个或多个实体的组件

Project.DataModel.[?]DataConfiguration

  • 许多程序集:即 CityDataConfiguration、CustomerDataConfiguration 等
  • 硬引用:Project.DataModel.[?]Data、EntityFramework
  • 运行时分辨率:无
  • 为上一个程序集中定义的实体定义 EntityTypeConfiguration 的组件。

项目.数据访问

  • 单个程序集
  • 硬引用:Project.DataModel、EntityFramework
  • 运行时解析:Project.DataModel.[?]Data、Project.DataModel.[?]DataConfiguration
  • 通过 EntityManager(抽象)提供 DbContext 的数据访问库。在运行时,此程序集查看配置或目录,加载 EntityType 及其等效的 EntityTypeConfigurations 并动态创建模型。

项目.ServiceModel.EntityDataService

  • 单个程序集
  • 硬引用:Project.DataModel、Project.DataAccess
  • 运行时分辨率:无
  • 一种通用服务,通过 EntityManager 类提供对 EntityData 对象的 CRUD 操作。

Project.ServiceModel.EntityDataServiceContract

  • 单个程序集
  • 硬引用引用:Project.DataModel
  • 运行时解析:Project.DataModel.[?]Data
  • 公开服务契约并需要定义 ServiceKnownTypes,因此我们需要 EntityTypes 的运行时解析。

项目.ServiceHost

  • 单个程序集
  • 硬引用:无
  • 运行时解析:Project.ServiceModel.[?]Service、Project.ServiceModel.[?]ServiceContract
  • 将在运行时解析和加载(通过配置或目录扫描)各种服务(例如 EntityDataService)的自定义 ServiceHost。

这感觉很像一个插件项目,我们在编译时了解不多,程序集之间也没有很多硬引用。

在这种情况下,您将如何实现 DI。我真的无法确定如何以及在何处使用 DI 或 DI 容器、Composition Root 等等。

非常感谢您的意见。

最佳答案

人们总有办法让依赖注入(inject)过于复杂。如果 FirstClass 需要一个 ISecondClass 才能工作,那么只需确保它不能在没有一个的情况下构建。组合根本质上是一个类,您可以遵循其依赖关系以了解其他所有内容。确保您的接口(interface)都已注册实例(单例生命周期通常可以很好地完成工作),实例化组合根并且大多数东西应该“正常工作”。如果没有,则表明涉及的内容超出了需要。

WizBang 应用程序可能如下所示:

interface IThingDoerA
{
}

class ThingDoerA : IThingDoerA
{
}

interface IThingDoerB
{
}

class ThingDoerB : IThingDoerB
{
private readonly IThingDoerA _tda;
public ThingDoerB(IThingDoerA tda)
{
_tda = tda;
}
}

interface IThingDoerC
{
}

class ThingDoerC : IThingDoerC
{
private readonly IThingDoerA _tda;
private readonly IThingDoerB _tdb;
public ThingDoerC(IThingDoerA tda, IThingDoerB tdb)
{
_tda = tda;
_tdb = tdb;
}
}

// I am the composition root.
interface IWizBang
{
public void StartApp();
}

class WizBang : IWizBang
{
private readonly IThingDoerA _tda;
private readonly IThingDoerC _tdc;
public WizBang(IThingDoerA tda, IThingDoerC tdc)
{
_tda = tda;
_tdc = tdc;
}

public void StartApp()
{
//TODO
// _tda.Blah()
// _tdc.Blah()
}
}

就 WPF 而言,看起来您可以在 System.Windows.Application 子类中执行一些轻量级方法调用来运行您的应用。

关于c# - nTier + 运行时解析中的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10682585/

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