0

我是 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

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

4

2 回答 2

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);
    }
于 2013-03-27T23:50:31.873 回答
0

尝试这个

int start_at = 1;
container.Register(
    Component.For<IMyComponent>().DependsOn(dependency: Dependency.OnValue<int>(start_at))
);                         
于 2014-10-14T14:26:19.977 回答