как зарегистрировать классы конструкторов на основе параметров в контейнере единства в С#?

Я новичок в шаблоне внедрения зависимостей. Пожалуйста, ознакомьтесь с приведенным ниже сценарием. Прямо сейчас мой код ниже тесно связан. Я хочу сделать это как легко связанный.

Может ли кто-нибудь помочь мне реализовать внедрение зависимостей с помощью 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>();

Но мне это не помогает.


person user1664906    schedule 26.04.2016    source источник
comment


Ответы (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"));
person abrown    schedule 27.04.2016