如何在C#中的unity容器中注册基于参数化的构造函数类?

时间:2016-04-26 12:19:15

标签: c# design-patterns dependency-injection unity-container loose-coupling

我是依赖注入模式的新手。请查看以下方案。现在,我的下面的代码是紧密耦合的。我想让它轻松耦合。

有人可以帮助我使用Unity实现依赖注入吗?

// Implementation of class A
public class A
{
  public B b{get;set;}
  public A(B b,string c)
  {
     this.b=b;
     this.A(b,c);
  }
}

//Implementation of Class B
public class B
{
    public int value1 {get;private set;}
    public string stringValue {get;private set;}

    public B(int value,string strValue)
    {
       this.value1=value;
       this.stringValue=strValue;
    }
}
//Implementation of class C
public class C
{   
  public void Dosomething()
  {
     B b=null;
     string value="Something";
     // Here I need to implement unity to resolve tight coupling 
     // without creating  object of Class A
     A a=new A(b,value); 

  }
}

我根据可能的重复问题累了一些东西。但我仍面临同样的问题。

我应该如何在Unity中注册这个具有参数化构造函数的类型?

我已经实现了以下代码

,而不是这一行
     A a=new A(b,value); 

var container=new UnityContainer();
container.RegisterType<A>();
container.RegisterType<B>();
A a=new A(b,container.ResolveType<B>();

但它没有帮助我。

1 个答案:

答案 0 :(得分:1)

首先,我会建议你通过引入接口来进一步解耦你的类,所以你可以按如下方式实现C类:

 public class C
{
    private readonly IA a;

    private readonly IB b;

    public C(IA a, IB b)
    {
        this.a = a;
        this.b = b;
    }

    public void Dosomething()
    {
        // do something with this.a or this.b.
    }
}

然后您可以注册并解决您的课程,如下所示:

var container = new UnityContainer();

        container.RegisterType<IB, B>(new InjectionConstructor(1, "Test"));
        container.RegisterType<IA, A>(new InjectionConstructor(new ResolvedParameter<IB>(),"Test"));
        container.RegisterType<IC, C>();

        var c = container.Resolve<IC>();

虽然我建议采用上述方法,但您也可以在解决时规定注射值,例如:

container.RegisterType<IB, B>();

container.Resolve<IB>(
            new ParameterOverride("value", 1), 
            new ParameterOverride("strValue", "Test"));