c# – 使用Autofac创建具有依赖关系的类的实例

前端之家收集整理的这篇文章主要介绍了c# – 使用Autofac创建具有依赖关系的类的实例前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
问题:

假设班级:

public class MyAwesomeClass
{
   private IDependCls _dependCls;
   public MyAwesomeClass(IDependCls dependCls)
   {
       _dependCls = dependCls;
   }

}

在其他地方我需要获得该类的实例,如下所示:

public class SomewhereElse
{
    public void AwesomeMethod()
    {
        //...
        // AwesomeStuff
        //...

        var GetErDone = new MyAwesomeClass();  // PROBLEM! No constructor with 0 arguements
    }
}

问题是,我

建议的解决方案1:

A)必须制作一个额外的构造来解决依赖关系吗?例如:

public MyAwesomeClass() // new constructor
   {
       _dependCls = DependencyResolver.Current.GetService<IDependCls>();
   }


public class SomewhereElse
{
    public void AwesomeMethod()
    {
        var GetErDone = new MyAwesomeClass();  // IT WORKS!!
    }
}

提议的解决方案2:

B)在var GetErDone之前使用AwesomeMethod中的解析器

public class SomewhereElse
{
    public void AwesomeMethod()
    {
        var depCls = _dependCls = DependencyResolver.Current.GetService<IDependCls>();
        var GetErDone = new MyAwesomeClass(depCls);  // IT WORKS!!
    }
}

Autofac解决方案?

C)其他一些Autofac方式?

寻找最佳实践,以及尽可能好的Autofac解决方案.我认为第一种方式是最差的,因为可选的依赖性可能会导致很多混乱.

摘要

当MyAwesomeClass具有依赖关系时,如何获得新的MyAwesomeClass()?

解决方法

看看 Composition Root模式.

你是对的,提升依赖性解决方案只会将问题转移到另一个地方.但是,如果继续在对象图中向上移动,则会到达应用程序的入口点.在那里,您将构成对象图.

将其与Service Locator anti-pattern(在您的情况下使用客户端类中的DependencyResolver)进行比较,您将看到Composition Root是一个出色的解决方案.

猜你在找的C#相关文章