0

私は Microsoft Unity Container を初めて使用するので、私の質問は些細なことかもしれません。パラメーターなしのコンストラクターが 1 つしかないクラスのインスタンスを登録して解決する必要がありました。ここで、単純なコンストラクターを使用してクラスを登録および解決する方法を学びたいと思います。これが私のクラスです。

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() コンストラクターを登録して解決する必要があります。次に、2番目を登録しようとしました

        //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 インスタンスを作成しようとすると、次のエラーが発生しました。

依存関係の解決に失敗しました。タイプ = "MySolution.MyProject.ViewModels.MyClass"、名前 = "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 に答える