gpt4 book ai didi

c# - 加载 Ninject 模块后设置所有绑定(bind)的范围

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

我想通过将 Ninject 绑定(bind)分成 Ninject 模块来组织它们。但是,我有不止一个应用程序会使用这些模块。其中一个是 ASP.Net MVC 应用程序,另一个是控制台应用程序,另一个是 Windows 服务,等等。在 MVC 应用程序中,我想使用 InRequestScope 范围绑定(bind),但是在另一个应用程序(引用 Ninject 模块所在的我的核心程序集)我想使用不同的范围绑定(bind)。这可能吗?

随着我的基础设施的发展和我所有绑定(bind)的注册变得非常庞大和冗长,我最终在几个不同的组合根中重复这些绑定(bind)——它们之间的唯一区别是每个绑定(bind)的生命周期范围。我真的想让它更干。

理想的是以下(伪代码):

多个应用引用的核心程序集

public class MyModule : NinjectModule {
public override Load(){
Kernel.Bind<IMyType>().To<MyType>();
}
}

在 MVC 应用程序中

kernel.Load(new MyModule())
.Configure(p => p.UseInRequestScope);

在另一个应用程序中

kernel.Load(new MyModule())
.Configure(p => p.UseInTransientScope);

最佳答案

A composition root用于编写应用程序。推而广之,如果您有多个应用程序,则应该有多个组合根。

它们是 not meant for reuse ,因为这会将应用程序紧密耦合在一起。正如帖子中指出的那样:

It makes no more sense to attempt to reuse a Composition Root than it does attempting to 'reuse' an application.

所以简短的回答是为每个应用程序使用一个组合根,然后您可以按照您想要的任何方式为每个应用程序确定关系范围。通过组合您的应用程序的组合根,您(至少)创建了一个如果您将它们分开就不会存在的人为问题。

关于c# - 加载 Ninject 模块后设置所有绑定(bind)的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29000490/

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