0

私はこのようなインターフェースを持っています:

ICreator<T> {}

私がやりたいことは、ユーザーが次のように依存関係を解決できるようにすることです。

var creator = container.Resolve<ICreator<IUser>>();

トリックは、具体的なタイプのカスタム作成を実行できるようにしたいということですICreator<T>。私の場合、 をCreator<T, TConcrete>使用するジェネリックを持つ型を取るコンストラクターを持つ がありますTConcrete。慣例により、 で定義された型を指定する必要があることはわかっていますがTConcrete、必要なもの、つまりインスタンスを作成するデリゲートが得られるようには見えません。TICreatorRegisterGenericCreator<,>

それとも、これは Autofac に存在し、見逃しているのでしょうか? 洞察をいただければ幸いです-TIA。

4

2 に答える 2

1

とを使用するOnActivatingReplaceInstance、必要なものを達成するために必要なフックになります。

builder.RegisterGeneric(typeof(FakeCreator<>)).As(typeof(ICreator<>)).OnActivating(args =>
    {
        // ...
        args.ReplaceInstance(new Creator<...,...>());
    });

Autofac は構成されたジェネリック型のインスタンスを作成するため、完全ではありませんが、機能します。

于 2013-03-12T13:37:10.870 に答える
0

特定の作成者を具象型に登録できます。サンプル:

public interface ICreator<T>
{
    void WriteName();
}

public class Creator<T> : ICreator<T>
{
    public void WriteName()
    {
        Console.WriteLine("I'm standard creator: " + typeof(T).FullName);
    }
}

public class CustomIntCreator : ICreator<int>
{
    public void WriteName()
    {
        Console.WriteLine("I'm custom int creator");
    }
}

class Program
{
    static void Main(string[] args)
    {
        ContainerBuilder cb = new ContainerBuilder();
        cb.RegisterGeneric(typeof (Creator<>)).As(typeof (ICreator<>));
        cb.RegisterType<CustomIntCreator>().As<ICreator<int>>();
        var container = cb.Build();

        var intCreator = container.Resolve<ICreator<int>>();            
        var standardCreator = container.Resolve<ICreator<double>>(); 
        intCreator.WriteName(); //writes "I'm custom int creator"
        standardCreator.WriteName(); //writes "I'm standard creator: System.Double"

        Console.ReadLine();
    }
}
于 2013-02-22T08:09:21.720 に答える