使用structuremap根据消费者解析不同的装饰实例



应用程序是一个ASP。NET MVC web应用程序是由存储库构建的,后端是一个具体的服务层。我使用结构映射3作为IoC来注入每个具体服务的存储库。用于日志/缓存等。我使用装饰库,它也是用结构映射设置的。

应用程序有公共部分和非公共部分。非公开部分是一些超级用户登录并创建和更新内容的地方。公共部分由http处理程序组成,暴露在web上,处理99.99%的应用程序请求。

我想配置结构映射使用缓存装饰存储库时,实例在http处理程序中解决,而不是在应用程序的其余部分。我还想在http处理程序中解析时向服务注入一个不同的记录器。

是否有可能根据消费者获得相同接口实现的不同设置?

public interface IEntityRepository<IEntity>
{
}
public class ContentService : IEntityService
{
   public ContentService(IEntityRepository<Content> repoistory, ILogger logger)
   {
   } 
}

注意,此解决方案不提供您正在寻找的功能-传递到DecorateAllWith的委托只被解析的每个类型调用一次。


DecorateAllWith方法有一个重载,可用于分析正在创建的类型并相应地进行过滤

[Fact]
public void DecorateAllWith_Filtered_IsNotReturned()
{
    var container = new StructureMap.Container(registry =>
    {
        registry.Scan(x =>
        {
            x.TheCallingAssembly();
            x.ConnectImplementationsToTypesClosing(typeof(IEntityRepository<>));
        });
        registry.For(typeof(IEntityRepository<>))
            .DecorateAllWith(typeof(CachingDecorator<>), instance => false);
    });
    var result = container.GetInstance<IEntityRepository<Entity1>>();
    Assert.IsNotType<CachingDecorator<Entity1>>(result);
}

最新更新