[英]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行為。
有什么辦法可以實現我想要的?
一個注冊不能產生多個組件。
我可以看到兩種解決您問題的方法
IRegistrationSource
來解析IEnumerable<T>
。 您可以查看CollectionRegistrationSource.cs來了解如何做 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.