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