鉴于以下服务结构:
public interface IFoo
{
void Print();
}
public class Foo<T> : IFoo
{
private T _item;
public Foo(T item)
{
_item = item;
}
public void Print()
{
Console.WriteLine(_item);
}
}
我有没有办法让Foo<T>
组件注册多种类型,而不是明确枚举它们?这有效,但我认为可能有更好的方法:
foreach (var t in myTypes)
{
container.Register(Component.For<IFoo>()
.ImplementedBy(typeof(Foo<>).MakeGenericType(new[] { t })));
}
答案 0 :(得分:1)
您在foreach type
循环中所做的工作是将开放通用组件的数量减少到与IFoo
相同的数量;有一种方法可以使用Castle IGenericImplementationMatchingStrategy
interface将它包装在一个干净的实现中,但是这个接口只允许你用一个签名关闭泛型类型;你不能用多种类型关闭泛型类型。
public class YourCustomGenericCloser: IGenericImplementationMatchingStrategy
{
public Type[] GetGenericArguments(ComponentModel model, CreationContext context)
{
if(context.RequestedType == typeof(IFoo))
{
return typeof(TheDefaultTypeToCloseAgainst);
}
return null;
}
}
我认为到目前为止,您的方法可能是在基本接口上注册具体泛型类型的简单方法。