该应用程序是一个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)
{
}
}
答案 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);
}