![](/img/trans.png)
[英]How to dynamically resolve InstancePerLifetimeScope dependency in ASP.NET Core?
[英]How to resolve a dependency based on attributes on a controller in ASP.NET Core MVC
我正在尝试尽可能轻松地在ASP.NET Core MVC
项目的数据访问层中实现缓存。 主要问题是我们不希望仅在某些页面上从所有页面的缓存中读取。 下面的示例应说明我们具有的设置类型:
[UseCache]
public class ControllerA : Controller
{
public ControllerA(IBuilder builder)
{
// Should resolve an IBuilder with a CacheService
}
}
public class ControllerB : Controller
{
public ControllerB(IBuilder builder)
{
// Should resolve an IBuilder with a NullCacheService
}
}
public class Builder : IBuilder
{
public Builder(ICacheService cacheService)
{
// The type of the resolved ICacheService depends on the UseCache
// attribute on any of the object that depends on this IBuilder
}
}
public class CacheService : ICacheService
{
public Object Get(string key, Func<Object> getValue)
{
// Check if the value is cached against Key and return it if it's not
// Obviously needs a lot more here regarding caching timeframes, expiry etc
}
}
public class NullCacheService : ICacheService
{
public Object Get(string key, Func<Object> getValue)
{
// Don't do anything with key, just do the work in getValue and return it
}
}
public class UseCacheAttribute : Attribute
{
}
我知道Autofac可以使用属性解决依赖关系,但是
ASP.NET Core MVC不支持Autofac.Extras.AttributeMetadata程序包
即使支持它,我也看不到它将如何支持包含此对象的对象的属性检测。
我很高兴介绍一个新的IoC框架,我们不依赖于Autofac或默认的IoC实现。
我要实现的目标有可能吗? 什么被认为是更好的缓存解决方案?
我很高兴介绍一个新的IoC框架,我们不依赖于Autofac或默认的IoC实现。
我对Autofac不太熟悉,但是对Simple Injector并不熟悉,因此我可以向您展示如何在Simple Injector中应用这种注册:
var cache = new CacheService();
container.RegisterConditional(typeof(IBuilder),
Lifestyle.Transient.CreateRegistration<Builder>(
() => new Builder(cache),
container),
c => c.Consumer.ImplementationType.GetCustomAttribute<UseCacheAttribute>() != null);
container.RegisterConditional(typeof(IBuilder),
Lifestyle.Transient.CreateRegistration<Builder>(
() => new Builder(new NullCacheService()),
container),
c => !c.Handled);
因为你想改变的依赖这个注册是有点复杂Builder
基于消费者类型Builder
。 查找到消费者的消费者的“链”是Simple Injector所不支持的,因为它很容易导致错误的行为,尤其是当中间消费者的生活方式不是短暂的时。 那是有条件的注册是针对IBuilder
而不是针对ICacheService
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.