gpt4 book ai didi

c# - 如何配置 Ninject 以便它为每个 Controller 创建一个实例

转载 作者:行者123 更新时间:2023-11-30 17:36:06 24 4
gpt4 key购买 nike

我正在尝试将 Ninject 用于 MVC5 应用程序,我想知道是否有任何方法可以配置它,以便每个 Controller 实例化一个对象。 (我不确定它是否与每个请求相同),在任何 Action 中使用该实例 Controller 和一次 Action已完成释放该对象使用的所有资源。

我希望 Ninject 注入(inject)我的 Controller 的类实现了 IDisposable 接口(interface)。

到目前为止我已经试过了:

  private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IUnitOfWork>().To<SqlUnitOfWork>();
}

但是 Dispose方法永远不会被调用。我也试过InRequestScope , 但它也没有用。

到目前为止,唯一真正起作用的是将我需要的对象的实例化包装在 using 中。每个 Controller 的声明 Action .

像这样:

using (var uow = UnitOfWorkFactory.Create())
{
var repos = new UserRepository(uow);

uow.SaveChanges();
}

编辑:

Ninject包添加的NinjectWebCommon类

 public static class NinjectWebCommon
{
private static readonly Bootstrapper bootstrapper = new Bootstrapper();

/// <summary>
/// Starts the application
/// </summary>
public static void Start()
{
DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
bootstrapper.Initialize(CreateKernel);
}

/// <summary>
/// Stops the application.
/// </summary>
public static void Stop()
{
bootstrapper.ShutDown();
}

/// <summary>
/// Creates the kernel that will manage your application.
/// </summary>
/// <returns>The created kernel.</returns>
private static IKernel CreateKernel()
{
var kernel = new StandardKernel();
try
{
kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

RegisterServices(kernel);
return kernel;
}
catch
{
kernel.Dispose();
throw;
}
}

/// <summary>
/// Load your modules or register your services here!
/// </summary>
/// <param name="kernel">The kernel.</param>
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IUnitOfWork>().To<SqlUnitOfWork>().InRequestScope();
}
}

从上面的代码可以看出,现在我使用的是kernel.Bind<IUnitOfWork>().To<SqlUnitOfWork>().InRequestScope(); ,但是 Dispose我类(class)的方法仍然没有被调用。

真的有什么方法可以用 Ninject 实现与 using 相同的行为吗?语句,也就是说,当创建的对象完成使用时(处理 ControllerAction 中的最后一行代码) Dispose调用了那个对象的方法?

最佳答案

Ninject 中有一个模块 需要安装、配置(并且是最新的)[ https://github.com/ninject/ninject/issues/132#issuecomment-42459686]以便在每个请求结束时确定性地完成此操作(与由 GC 驱动相比)。

关于c# - 如何配置 Ninject 以便它为每个 Controller 创建一个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40198294/

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