gpt4 book ai didi

c# - 手动解析由属性约束绑定(bind)的依赖项

转载 作者:太空宇宙 更新时间:2023-11-03 10:36:00 24 4
gpt4 key购买 nike

我有两个绑定(bind):

Bind<ICache>().ToMethod(ctx => FactoryMethods.CreateCache(
ctx.Kernel.Get<IXXX>(),
ctx.Kernel.Get<IYYY>()))
.WhenTargetHas<SharedCacheAttribute>()
.InSingletonScope()
.Named(BindingNames.SHARED_CACHE);

Bind<ICache>().ToMethod(ctx => FactoryMethods.CreateTwoTierCache(
ctx.Kernel.Get<ICache>(BindingNames.SHARED_CACHE),
ctx.Kernel.Get<IZZZ>()))
.InSingletonScope();

基本上我的想法是我有一个共享缓存(在第一个绑定(bind)中定义),但大多数时候我希望类使用具有相同接口(interface) (ICache) 的两层缓存。因此,我使用属性约束来限制共享缓存的使用(需要直接访问共享缓存的类可以只使用 [SharedCache])。

现在,问题是第二个绑定(bind),特别是这一行:

ctx.Kernel.Get<ICache>(BindingNames.SHARED_CACHE),

正在抛出一个异常,表明没有可用的匹配绑定(bind),可能是因为第一个绑定(bind)的属性约束。

如何将第一个绑定(bind)的解析结果注入(inject)到第二个绑定(bind)的工厂方法中?

解决方法:

目前,我在第一个绑定(bind)上使用一个Parameter 和一个更复杂的基于When() 的约束。我的绑定(bind)现在看起来像这样:

Bind<ICache>().ToMethod(ctx => FactoryMethods.CreateCache(
ctx.Kernel.Get<IXXX>(),
ctx.Kernel.Get<IYYY>()))
.When(o => (o.Target != null &&
o.Target.GetCustomAttributes(typeof (SharedCacheAttribute), false).Any()) ||
o.Parameters.Any(p => p.Name == ParameterNames.GET_SHARED_CACHE))
.InSingletonScope();

Bind<ICache>().ToMethod(ctx => FactoryMethods.CreateTwoTierCache(
ctx.Kernel.Get<ICache>(new Parameter(ParameterNames.GET_SHARED_CACHE, true, true)),
ctx.Kernel.Get<IZZZ>()))
.InSingletonScope();

它按预期工作,但语法非常复杂。此外,我希望必须将 Parameter 构造函数的“shouldInherit”参数设置为 false 以防止 GET_SHARED_CACHE 参数传递给子请求。碰巧的是,将此设置为 false 最终会导致 StackOverflowException,因为当此设置为 false 时,该参数会跨请求保留。将它设置为 true 会导致它不传播 - 这与我的预期相反。

最佳答案

另一种方法是用 NamedAttribute 替换 SharedCacheAttribute。这是一个例子:

//bindings
Bind<ICache>().ToMethod(ctx => FactoryMethods.CreateCache(
ctx.Kernel.Get<IXXX>(),
ctx.Kernel.Get<IYYY>()))
.InSingletonScope()
.Named(BindingNames.SHARED_CACHE);

Bind<ICache>().ToMethod(ctx => FactoryMethods.CreateTwoTierCache(
ctx.Kernel.Get<ICache>(BindingNames.SHARED_CACHE),
ctx.Kernel.Get<IZZZ>()))
.InSingletonScope();

// cache users
public class UsesSharedCache
{
public UsesSharedCache([Named(BindingNames.SHARED_CACHE)] ICache sharedCache)
{
}
}

public class UsesDefaultCache
{
public UsesDefaultCache(ICache defaultCache)
{
}
}

另一种选择是 IProvider .绑定(bind)看起来像这样:

Bind<ICache>().ToProvider<CacheProvider>();

CacheProvider 将包含确定是检索“默认”缓存还是共享缓存的逻辑。它需要检查属性,然后解析并返回相应的实例。因此,ICache 需要另外两个命名绑定(bind):

Bind<ICache>().ToMethod(...).Named("default")
.BindingConfiguration.IsImplicit = true;
Bind<ICache>().ToMethod(...).Named("shared");
.BindingConfiguration.IsImplicit = true;

备注:.BindingConfiguration.IsImplicit = true; 是必需的,否则 ninject 会认为对 ICache(没有名称)的请求由所有绑定(bind)实现 - 并抛出一个异常(exception)。该请求仅需由提供者满足。

关于c# - 手动解析由属性约束绑定(bind)的依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27796718/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com