0

UserControlC# プロジェクトにいくつかの s があり、次のコードを使用Structuremap 3する s にアクセスしたいときに IoC コンテナーとして使用します。UserControl

var uc = new UserControlFactory().Create<MyUserControl>();
....

これはUserControlFactoryコードです:

public class UserControlFactory:IUserControlFactory
{
    public T Create<T>() where T : UserControl
    {
        return (T) ObjectFactory.GetInstance(typeof(T));
    }
}

s コンストラクターのパラメーターinterfaceとしていくつかの s がある場合、正常に動作します。UserControl

public class MyUserControl:UserControl
{
    public MyUserControl(IMyInterface myInterface)
    {
    }
}

UserControlしかし今、コンストラクターを介してオブジェクトを渡したい:

public class MyUserControl:UserControl
{
    public MyUserControl(IMyInterface myInterface,MyClass object1)
    {
    }
}

どうやってやるの?

4

3 に答える 3

0

次のように、コンストラクター引数に何を使用するかを知るために StructureMap を構成できます。

            c.For<IFoo>().Use<Foo>().Ctor<Bar>(bar);

あなたの場合、おそらく次のようになります。

            var myClass = new MyClass();
            c.For<MyUserControl>().Use<MyUserControl>().Ctor<MyClass>(myClass);

ただし、これは MyUserControl ごとに MyClass の同じインスタンスを使用します。毎回使用されるオブジェクトをより詳細に制御したい場合は、ialekseevの答えを使用します。

于 2014-12-22T13:20:29.297 に答える
0

次のように、パラメーターをコンストラクターに渡すことができます。

public class UserControlFactory:IUserControlFactory
{
    public T Create<T>(MyClass object1) where T : UserControl
    {
        return (T) ObjectFactory.With("object1").EqualTo(object1).GetInstance(typeof(T));
    }
}
于 2014-12-22T07:28:59.083 に答える
0

そのようなタイプを解決できるはずです:

public class MyUserControl : UserControl
{
    public MyUserControl(IMyInterface myInterface, MyClass object1)
    {
    }
}

StructureMap は具象型を自動配線するため ( MyUserControlMyClassを登録する必要はありません)。このコードが機能するために必要なのは、IMyInterfaceを登録することだけです。

c.For<IMyInterface>().Use<MyInterface>();

MyUserControlを解決しようとすると、どのようなエラーが発生しますか?

サイドノート

これを簡単にリファクタリングできます:

public class UserControlFactory : IUserControlFactory
{
    public T Create<T>() where T : UserControl
    {
        return (T) ObjectFactory.GetInstance(typeof(T));
    }
}

提供されている汎用 API を使用するには:

public class UserControlFactory : IUserControlFactory
{
    public T Create<T>() where T : UserControl
    {
        return ObjectFactory.GetInstance<T>();
    }
}

お役に立てれば。

于 2014-12-22T21:33:48.090 に答える