为实现指定多个泛型类型

本文关键字:泛型类型 实现 | 更新日期: 2023-09-27 18:13:04

给定以下服务结构:

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

为实现指定多个泛型类型

您在foreach type循环中所做的是将打开的通用组件的数量减少到与IFoo相同的数量;有一种方法来包装这在一个干净的实现使用城堡IGenericImplementationMatchingStrategy接口,但这个接口只允许你关闭一个泛型类型与一个签名;不能使用多个类型关闭泛型类型。

public class YourCustomGenericCloser: IGenericImplementationMatchingStrategy
{
   public Type[] GetGenericArguments(ComponentModel model, CreationContext context)
   {
      if(context.RequestedType == typeof(IFoo))
      {
         return typeof(TheDefaultTypeToCloseAgainst);
      }
      return null;
   }
}

我认为到目前为止,您的方法可能是针对基本接口注册具体泛型类型的更简单方法。