1

我一直在努力让 DecorateAllWith 处理通用接口。我在这里阅读了一些帖子,他们使用拦截器解决了这个问题,但他们似乎使用的是较旧的结构图版本,它似乎不是一个“干净”的解决方案。

我真的需要一些帮助才能让它与结构图 3 一起使用

我有一个通用存储库,我想用日志记录和缓存来装饰它

public interface IEntityRepository<T> where T : Entities.IEntity
{
}

我有大约 20 个继承 IEntityRepository 的接口。示例 mu UserRepository

public interface IUserEntityRepository : IEntityRepository<User>
{
}

然后我有日志装饰器具体类型,我希望 IEntityRepository 的所有实例都用它来装饰

public class LoggingEntityRepository<T> : IEntityRepository<T> where T : Entities.IEntity
{
    private readonly IEntityRepository<T> _repositoryDecorated;

    public LoggingEntityRepository(IEntityRepository<T> repositoryDecorated)
    {
        _repositoryDecorated = repositoryDecorated;
    }
}

还是有其他更适合我想要完成的 IoC 容器?

编辑:有没有办法装饰从 IEntityRepository 继承的所有接口

4

1 回答 1

0

这是一个回答您的第一个问题的工作示例

[Fact]
public void DecorateAllWith_AppliedToGenericType_IsReturned()
{
    var container = new Container(registry =>
    {
        registry.Scan(x =>
        {
            x.TheCallingAssembly();
            x.ConnectImplementationsToTypesClosing(typeof(IEntityRepository<>));

        });

        registry.For(typeof(IEntityRepository<>))
            .DecorateAllWith(typeof(LoggingEntityRepository<>));
    });

    var result = container.GetInstance<IEntityRepository<Entity1>>();

    Assert.IsType<LoggingEntityRepository<Entity1>>(result);
}

为了回答您的第二个问题,我个人使用(并为)Simple Injector - 它是可用的最快容器之一,对泛型提供全面支持并提供一些强大的诊断服务。

Simple Injector 中的注册如下所示:

[Fact]
public void RegisterDecorator_AppliedToGenericType_IsReturned()
{
    var container = new SimpleInjector.Container();

    container.RegisterManyForOpenGeneric(
        typeof(IEntityRepository<>), 
        typeof(IEntityRepository<>).Assembly);

    container.RegisterDecorator(
        typeof(IEntityRepository<>), 
        typeof(LoggingEntityRepository<>));

    var result = container.GetInstance<IEntityRepository<Entity1>>();

    Assert.IsType<LoggingEntityRepository<Entity1>>(result);
}
于 2014-08-05T10:14:44.260 回答