UnityContainer。如何使用参数注册类构造函数

时间:2013-03-27 16:11:30

标签: class dependency-injection constructor dependencies unity-container

我是Microsoft Unity Container的新手,所以我的问题可能微不足道。 我必须注册并解决只有一个无参数构造函数的类的实例。现在我想学习如何使用简单的构造函数注册和解析类。这是我的班级。

public class MyClass
{
    private string a1;

    public string A1
        {
        get { return a1; }
        set { a1 = value; }
        }
    private int a2;

    public int A2
        {
        get { return a2; }
        set { a2 = value; }
        }
    public MyClass()
    { this.a1 = "aaaaa";
    this.a2 = 1;
    }

    public MyClass(string a1,int a2)
        {
        this.a1 = a1;
        this.a2 = a2;
        }
    }

我必须注册并解析MyClass()构造函数;然后,我试着注册第二个

        //App.xaml.cs
        container = new UnityContainer();
        container.RegisterType<MainView>();
        ............
        container.RegisterType<string>("A1");
        container.RegisterType<int>("A2");
        container.RegisterType<MyClass>("MyClassConstructor",new InjectionConstructor(new ResolvedParameter<string>("A1"),new ResolvedParameter<int>("A2")));

        //NavigationService.cs, create an instance of MyClass("mystring",100) and bind it to a window
        public Window ShowMainView()
        {
        var window = Container.Resolve<MainView>();

        MyClass myClass = Container.Resolve<MyClass>("MyClassConstructor", new ParameterOverrides { { "A1", "mystring" }, { "A2", 100 } });
        window.DataContext = myClass ;
        window.Show();
        return window;
        }

当容器尝试创建MyClass实例时,我收到此错误:

依赖项的解析失败,type =“MySolution.MyProject.ViewModels.MyClass”,name =“MyClassConstructor”。 在解决时发生异常。

异常是:InvalidOperationException - 无法构造String类型。您必须配置容器以提供此值。

在例外时,容器是:

解析MySolution.MyProject.ViewModels.MyClass,MyClassConstructor   解析构造函数MySolution.MyProject.ViewModels.MyClass(System.String a1,System.Int32 a2)的参数“a1”     解析System.String,A1

请帮助我理解它是如何工作的。感谢

2 个答案:

答案 0 :(得分:1)

你在注册方面做得太多了 更重要的是,您需要指定构造函数参数名称(小写),而不是属性名称(大写)。

以下是它的外观:

    [TestMethod]
    public void Should_Be_Able_To_Pass_Parameters_To_Ctor()
    {
        var container = new UnityContainer();

        container.RegisterType<MyClass>();

        var myClass = container.Resolve<MyClass>( 
            new ParameterOverrides { { "a1", "mystring" }, { "a2", 100 } });

        Assert.IsNotNull(myClass);
        Assert.AreEqual("mystring", myClass.A1);
        Assert.AreEqual(100, myClass.A2);
    }

答案 1 :(得分:0)

试试这个

int start_at = 1;
container.Register(
    Component.For<IMyComponent>().DependsOn(dependency: Dependency.OnValue<int>(start_at))
);