簡體   English   中英

Autofac:注冊多個

[英]Autofac: Register multiple

一個模塊注冊了一個看起來像這樣的類型:

class MyType
{
    public IEnumerable<IServer> Servers { get { ... } }
}

我想向容器注冊每個服務器實例:

builder.Register(x => x.Resolve<MyType>().Servers).As<IEnumerable<IServer>>();

我想另外注冊一個IServer實現

builder.RegisterType<AnotherServer>().As<IServer>().SingleInstance;

然后,我想獲取所有服務器-聯合OS服務器屬性和AnotherServer的實例:

public MyClass(IEnumerable<IServer> allServers)
{
}

但是,上述設置無效,因為注冊IEnumerable的實際實例似乎會覆蓋請求IEnumerable時提供所有已注冊實現的Autofac行為。

有什么辦法可以實現我想要的?

一個注冊不能產生多個組件。

我可以看到兩種解決您問題的方法

  1. 創建一個新的IRegistrationSource來解析IEnumerable<T> 您可以查看CollectionRegistrationSource.cs來了解如何做
  2. 在激活期間,使用模塊替換IEnumerable

像這樣的東西:

public interface IContainer<T> { 
   IEnumerable<T> Values { get; }  
}

public class MyType : IContainer<IServer>
{
    public IEnumerable<IServer> Servers
    {
        get
        {
            yield return new Server1();
            yield return new Server2();
        }
    }

    IEnumerable<IServer> IContainer<IServer>.Values
    {
        get { return this.Servers; }
    }
}

public class AggregatedEnumerableModule<T> : Module
{
    protected override void AttachToComponentRegistration(IComponentRegistry componentRegistry, IComponentRegistration registration)
    {
        if (registration.Activator.LimitType.IsArray)
        {
            Type elementType = registration.Activator.LimitType.GetElementType();
            if (elementType == typeof(T))
            {
                registration.Activating += (sender, e) =>
                {
                    IEnumerable<T> originalValues = (IEnumerable<T>)e.Instance;
                    IEnumerable<T> newValues = e.Context.Resolve<IContainer<T>>().Values;
                    IEnumerable<T> aggregatedValues = newValues.Concat(originalValues);

                    e.ReplaceInstance(aggregatedValues);
                };
            }
        }
        base.AttachToComponentRegistration(componentRegistry, registration);
    }
}

然后

ContainerBuilder builder = new Autofac.ContainerBuilder();
builder.RegisterModule(new AggregatedEnumerableModule<IServer>());
builder.RegisterType<MyType>().As<IContainer<IServer>>();
builder.RegisterType<Server3>().As<IServer>();

IContainer container = builder.Build();

IEnumerable<IServer> pouets = container.Resolve<IEnumerable<IServer>>();

暫無
暫無

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

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