gpt4 book ai didi

ninject - 防止Ninject绑定(bind)多个接口(interface)时多次调用Initialize

转载 作者:行者123 更新时间:2023-12-03 12:11:00 24 4
gpt4 key购买 nike

我们有一个具体的单例服务,它实现了 Ninject.IInitializable和2个接口(interface)。问题是服务 Initialize-methdod 被调用了 2 次,而只需要一次。我们正在使用 .NET 3.5 和 Ninject 2.0.0.0。

Ninject 中是否有一种模式可以防止这种情况发生。这两个接口(interface)都没有实现 Ninject.IInitializable .服务等级是:

public class ConcreteService : IService1, IService2, Ninject.IInitializable
{
public void Initialize()
{
// This is called twice!
}
}

模块看起来像这样:
public class ServiceModule : NinjectModule
{
public override void Load()
{
this.Singleton<Iservice1, Iservice2, ConcreteService>();
}
}

其中 Singleton 是一个扩展方法,定义如下:
    public static void Singleton<K, T>(this NinjectModule module) where T : K
{
module.Bind<K>().To<T>().InSingletonScope();
}

public static void Singleton<K, L, T>(this NinjectModule module)
where T : K, L
{
Singleton<K, T>(module);
module.Bind<L>().ToMethod(n => n.Kernel.Get<T>());
}

当然,我们可以将 bool initialized-member 添加到 ConcreteService 并仅在它为 false 时进行初始化,但这似乎有点 hack。并且它需要在实现两个或多个接口(interface)的每个服务中重复相同的逻辑。

感谢所有的答案!我从他们所有人身上学到了一些东西! (我很难决定哪一个标记是正确的)。

我们最终创建了 IActivable 接口(interface)并扩展了 ninject 内核(它还很好地删除了对 ninject 的代码级依赖,尽管属性仍然存在)。

最佳答案

忍者3

Ninject 3.0 现在在绑定(bind)调用中支持多种泛型类型,您尝试做的事情可以在单个链式语句中轻松完成。

kernel.Bind<IService1, IService2>()
.To<ConcreteService>()
.InSingletonScope();

忍者2

您正在设置两个不同的绑定(bind) K=>T 和 L=>T。请求 L 的实例将返回 T 的瞬时实例。请求 K 将返回 T 的单例实例。

在 Ninject 2.0 中,对象作用域是每个服务接口(interface)绑定(bind)到作用域回调的。

当你有
Bind<IFoo>...InSingletonScope();
Bind<IBar>...InSingletonScope();

您正在创建两个不同的范围。

你是说
“绑定(bind)到 IFoo 将解析为返回的相同对象
当 .Get 被调用时。

“绑定(bind)到 IBar 将解析为返回的相同对象
当 .Get 被调用时。

您可以将绑定(bind)链接在一起,但您需要删除 可初始化 因为它会在实例被激活时导致重复初始化:
kernel.Bind<IBoo>()
.To<Foo>()
.InSingletonScope();
.OnActivation(instance=>instance.Initialize());

kernel.Bind<IBaz>()
.ToMethod( ctx => (IBaz) ctx.Kernel.Get<IBoo>() );

或者
kernel.Bind<Foo>().ToSelf().InSingletonScope()
.OnActivation(instance=>instance.Initialize());
kernel.Bind<IBaz>().ToMethod( ctx => ctx.Kernel.Get<Foo>() );
kernel.Bind<IBoo>().ToMethod( ctx => ctx.Kernel.Get<Foo>() );

为了让多个接口(interface)解析到同一个单例实例。当我看到这样的情况时,我总是要问,如果你有一个有两个职责的单例,你的对象是不是做得太多了?

关于ninject - 防止Ninject绑定(bind)多个接口(interface)时多次调用Initialize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3043441/

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