簡體   English   中英

提供一個委托來解決Autofac中已注冊的開放泛型

[英]Providing a delegate to resolving registered open generics in Autofac

我有一個像這樣的界面:

ICreator<T> {}

我想做的是讓用戶像這樣解決依賴性:

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

訣竅是我希望能夠對ICreator<T>的具體類型進行一些自定義創建。 就我而言,我有一個Creator<T, TConcrete> ,它的構造函數采用帶有使用TConcrete的泛型的類型。 按照慣例,我知道應該為TConcrete的類型賦予ICreator定義的T ,但是RegisterGeneric似乎並不能滿足我的需要,它是創建Creator<,>實例的委托。

也許Autofac中確實存在此功能,但我想念它了嗎? 任何見識將不勝感激-TIA。

使用OnActivatingReplaceInstance是完成我需要的必要鈎子:

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

這不是完美的,因為Autofac會創建已配置的泛型類型的實例,但它可以工作。

您可以為特定類型注冊特定的創建者。 樣品:

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();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM