2

我正在为我的 DI 容器使用 SimpleInjector。我有一个带有 2 个类型参数的开放通用接口

public interface IAdapter<TRepository, TEntity>
    where TRepository : AbstractRepository
    where TEntity : AbstractModel, new()
{
}

我在容器中注册为:

container.RegisterOpenGeneric(typeof(IAdapter<,>), 
    typeof(Adapter<,>));

我想根据提供的类型来装饰 IAdapter。例如(我知道这段代码无效,但它演示了我正在尝试做的事情)

class RepositoryX : AbstractRepository { }
class RepositoryY : AbstractRepository { }
class RepositoryZ : AbstractRepository { }

container.RegisterDecorator(typeof(IAdapter<RepositoryY,>), 
    typeof(SpecificAdapterDecorator<,>));

container.RegisterDecorator(typeof(IAdapter<[RepositoryX|RepositoryZ],>), 
    typeof(GeneralAdapterDecorator<,>));

有没有办法做到这一点?

4

1 回答 1

2

通用装饰器文档中:

有一个RegisterDecorator可用的重载,允许您提供一个谓词来确定该装饰器是否应该应用于特定的服务类型。使用给定的上下文,您可以确定是否应该应用装饰器。

所以你需要这样的东西:

container.RegisterDecorator(
    typeof(IAdapter<,>), 
    typeof(SpecificAdapterDecorator<,>), 
    c => c.ServiceType.GetGenericArguments()[0] == typeof(RepositoryY));

container.RegisterDecorator(
    typeof(IAdapter<,>), 
    typeof(GeneralAdapterDecorator<,>), 
    c => c.ServiceType.GetGenericArguments()[0] != typeof(RepositoryY));
于 2012-12-28T18:50:56.230 回答