C#   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了autofac / c#:特定基类的通用工厂?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
autofac是否可以创建只能解析特定基类类型的通用工厂?

我现在看到改造一个’brownfield’c#项目使用autofac是多么可行.该项目需要创建一个不同类型但具有相同基类的组件树.这些组件需要身份验证和数据库服务(以及其他内容),因此很难只拥有空构造函数.

因此,工厂可以创建导出基类的对象,使用autofac扫描这些类,并为它们提供工厂.我认为如果你不必为每个类提供工厂,它可能会更容易构建组件对象树.

除此之外,还是这是一个糟糕设计的标志?组件和树应该尽可能少地执行,我们将此树传递给其他服务以提供处理和呈现吗?

像(哪里?是神秘工厂)的东西

public MyBase { 
    public Add(MyBase X) {..}
}

public DerivedA: MyBase {}

public DerivedB : MyBase {}

public DerivedC : DerivedA {}

public SomethingElse
{
     private ? _myBaseFact;

     public SomethingElse(? myBaseFact) { 
            _myBaseFact = myBaseFact;
     }

     public BuildComponentTree() {
        DerivedA a = _myBaseFact<DerivedA>();
        DerivedB b = _myBaseFact<DerivedB>();
        DerivedC c = _myBaseFact<DerivedC>();
        a.Add(b);
        b.Add(c);
     }
}

编辑:我被要求一个更具体的例子,这是公平的:)有框架组件,我想允许开发人员创建自己的组件,而无需注册autofac.拥有工厂类意味着开发人员必须将自定义组件添加到此工厂吗?请原谅这个例子,这与我遇到它时框架的工作原理类似.

FwComponent {
    public FwComponent (DataProvider,AuthManager,OtherModulE)
    public Add(FwComponent X);
    public Setup();
    public Process();
    public Render();
}

Page : FwComponent {
    public Page(DataProvider,OtherModulE): base(..)
    public String title;
    ...
}

Input: FwComponent {
    public Input(DataProvider,OtherModulE): base(..)
    public String Name;
    public int length;
    ...
}

Button: FwComponent {
    public Button(DataProvider,OtherModulE): base(..)
    public String Name;
    ...
}

----

MyCustomButton : Button {
     public MyCustomButton(DataProvider,OtherModulE): base(..)
}

MyPersonalPage : FwComponent {

    IContext _container;

    public MyPersonalPage(DataProvider,OtherModule,IContext container): base(..)

    public Setup() {
         var input = _container.Resolve<Input>();
         input.Name = 'xxx';
         input.length = 10;
         Add(input);

         var butt = _container.Resolve<MyCustomButton>();
         butt.name = "xxx";
         Add(butt);    
    }

    public Process() {
        DataProvider.Dostuff();
    }
}

解决方法

在您提供的代码示例中,您似乎使用_myBaseFact< DerivedA>()和_myBaseFact< DerivedB>()请求特定类型.很难看出你想要完成什么,但这对我来说似乎是一种代码味道,因为你仍然依赖于具体的类型.

在我看来,你有两个选择:你注入一个工厂并抽象出派生类型,或者你直接将派生类型注入构造函数.使用工厂在两个场景中很有用:

1:您有某种(不是基于类型的)参数,允许工厂识别返回的类型,如以下示例所示:

public class MyBaseFactory : IMyBaseFactory
{
    public MyBase CreateMyBase(IUserContext user)
    {
        // Create a MyBase based on a user object.
    }
}

2:您的工厂有多种工厂方法

public class MyBaseFactory : IMyBaseFactory
{
    private Autofac.IContainer container;

    public MyBase CreateMyBaseForScenarioA()
    {
        return container.Resolve<DerivedA>();
    }

    public MyBase CreateMyBaseForScenarioB()
    {
        return container.Resolve<DerivedB>();
    }
}

请注意,两个工厂方法都返回MyBase,而不是特定类型.关于多态的整个想法是你不应该关心具体类型.

IMO无论Autofac是否可以为您创建工厂都无关紧要.您不应该依赖于类似于框架的结构,而是依赖于良好的应用程序设计.如果您采用工厂方法,请为该工厂定义接口并根据该接口注入实例.这使得设计非常干净,并且非常好地传达了它的意图.

大佬总结

以上是大佬教程为你收集整理的autofac / c#:特定基类的通用工厂?全部内容,希望文章能够帮你解决autofac / c#:特定基类的通用工厂?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。