根据具有结构图的消费者来解析不同的装饰实例

时间:2014-08-07 09:10:03

标签: c# dependency-injection ioc-container structuremap

该应用程序是一个ASP.NET MVC webapp,由后端的具体服务层所构成的存储库构建。我使用结构图3作为IoC为每个具体服务注入存储库。对于日志记录/缓存等,我使用了装饰的存储库,它也是用结构图设置的。

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

我想配置结构图以在http处理程序中解析实例时使用缓存修饰的存储库,但不在应用程序的其余部分中解析。在http处理程序中解析时,我还想为服务注入一个不同的记录器。

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

public interface IEntityRepository<IEntity>
{
}

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

   } 
}

1 个答案:

答案 0 :(得分:2)

请注意,此解决方案不提供您要查找的功能 - 传递到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);
}