C# 抽象工厂合为一体

C# 抽象工厂合为一体,c#,dependency-injection,unity-container,abstract-factory,C#,Dependency Injection,Unity Container,Abstract Factory,我们正在构建一个与其他系统有许多集成接触点的应用程序。我们正在有效地使用Unity满足我们所有的依赖注入需求。整个业务层是用接口驱动的方法构建的,在应用程序的引导过程中,实际实现被注入到外部组合根中 我们希望以优雅的方式处理集成层。业务类和存储库依赖于IIntegrationController建议的方法,但我们无法让它顺利工作 您的设计的好处在于您已经有了正确的抽象概念。您使用通用抽象,因此只需在已经坚实的设计之上应用正确的模式,就可以解决问题 换句话说,使用代理: //此类应被视为组合根的一

我们正在构建一个与其他系统有许多集成接触点的应用程序。我们正在有效地使用Unity满足我们所有的依赖注入需求。整个业务层是用接口驱动的方法构建的,在应用程序的引导过程中,实际实现被注入到外部组合根中

我们希望以优雅的方式处理集成层。业务类和存储库依赖于
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<>));