C# 抽象工厂合为一体
我们正在构建一个与其他系统有许多集成接触点的应用程序。我们正在有效地使用Unity满足我们所有的依赖注入需求。整个业务层是用接口驱动的方法构建的,在应用程序的引导过程中,实际实现被注入到外部组合根中 我们希望以优雅的方式处理集成层。业务类和存储库依赖于C# 抽象工厂合为一体,c#,dependency-injection,unity-container,abstract-factory,C#,Dependency Injection,Unity Container,Abstract Factory,我们正在构建一个与其他系统有许多集成接触点的应用程序。我们正在有效地使用Unity满足我们所有的依赖注入需求。整个业务层是用接口驱动的方法构建的,在应用程序的引导过程中,实际实现被注入到外部组合根中 我们希望以优雅的方式处理集成层。业务类和存储库依赖于IIntegrationController建议的方法,但我们无法让它顺利工作 您的设计的好处在于您已经有了正确的抽象概念。您使用通用抽象,因此只需在已经坚实的设计之上应用正确的模式,就可以解决问题 换句话说,使用代理: //此类应被视为组合根的一
IIntegrationController建议的方法,但我们无法让它顺利工作
您的设计的好处在于您已经有了正确的抽象概念。您使用通用抽象,因此只需在已经坚实的设计之上应用正确的模式,就可以解决问题
换句话说,使用代理:
//此类应被视为组合根的一部分。
内部类集成控制器Dispatcher
:i集成控制器
{
私有只读IUserContext userContext;
专用只读系列1_集成控制器系列1控制器;
专用只读家庭2\u集成控制器家庭2控制器;
公共集成控制器Dispatcher(
IUserContext用户上下文,
Family1_集成控制器Family1控制器,
Family2_集成控制器Family2控制器){
this.userContext=userContext;
this.family1Controller=family1Controller;
this.family2Controller=family2Controller;
}
公共TResult句柄(TRequest请求){
返回此.GetController()句柄(请求);
}
专用IIintegrationController GetController(){
返回this.userContext.IsInFamily(“family1”))
?这是一个家庭控制器
:this.family2Controller;
}
}
使用该类,您可以将整个配置简化为:
container.RegisterType<IUserContext, AspNetUserContext>();
container.RegisterType(
typeof(IIntegrationController<,>),
typeof(IntegrationControllerDispatcher<,>));
container.RegisterType(typeof(Repository<>), typeof(Repository<>));
container.RegisterType();
容器.注册表类型(
类型(集成控制器),
类型(集成控制器Dispatcher));
RegisterType(typeof(Repository),typeof(Repository));
注意以下几点:
- 请注意执行开放泛型映射的注册的使用。您不必逐个注册所有已关闭的版本。只需一行代码即可完成
- 还请注意,不同族的类型不相同
注册的。团结可以自动解决问题,因为我们的
集成控制器Dispatcher
直接依赖于它们。这
类是基础结构逻辑的一部分,应该放在
你的作文是根
- 请注意,在构建对象图期间,不会做出使用特定族实现的决定;它是在运行时生成的,因为确定它的值是运行时值。在构建对象图时尝试确定这一点只会使事情变得复杂,并且使验证对象图变得更加困难
- 此外,此运行时值被抽象到函数调用之后,并放置在抽象之后(
IUserContext.IsInFamily
,在本例中,这只是一个示例)
我对现实生活中的实现不太清楚。您是否可以添加对使用此方法的某些代码的引用?当然,如果你有。
container.RegisterType<IUserContext, AspNetUserContext>();
container.RegisterType(
typeof(IIntegrationController<,>),
typeof(IntegrationControllerDispatcher<,>));
container.RegisterType(typeof(Repository<>), typeof(Repository<>));