asp.net - asp.net mvc 2应用程序中的IoC和dataContext配置

标签 asp.net garbage-collection inversion-of-control

我有 Global.asax ,如下代码所示:

public class MvcApplication : System.Web.HttpApplication
{
    public static void RegisterRoutes(RouteCollection routes)
    {
    // ....
    }

    protected void Application_Start()
    {
    AreaRegistration.RegisterAllAreas();

    RegisterRoutes(RouteTable.Routes);

    ControllerBuilder.Current.SetControllerFactory(typeof(IOCControllerFactory));
    }
}

public class IOCControllerFactory : DefaultControllerFactory
{
    private readonly IKernel kernel;

    public IOCControllerFactory()
    {
        kernel = new StandardKernel(new NanocrmContainer());
    }

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        if (controllerType == null)
            return base.GetControllerInstance(requestContext, controllerType);

        var controller = kernel.TryGet(controllerType) as IController;

        if (controller == null)
            return base.GetControllerInstance(requestContext, controllerType);

        var standartController = controller as Controller;

        if (standartController is IIoCController)
            ((IIoCController)standartController).SetIoc(kernel);

        return standartController;
    }

    class NanocrmContainer : Ninject.Modules.NinjectModule
    {
        public override void Load()
        {
            // ...

            Bind<DomainModel.Entities.db>().ToSelf().InRequestScope().WithConstructorArgument("connection", "Data Source=lims;Initial Catalog=nanocrm;Persist Security Info=True;User ID=***;Password=***");
        }
    }
}

在这种情况下,如果某个地方是类,定义如下:

public class UserRepository : IUserRepository
{
    private db dataContext;
    private IUserGroupRepository userGroupRepository;

    public UserRepository(db dataContext, IUserGroupRepository userGroupRepository)
    {
        this.dataContext = dataContext;
        this.userGroupRepository = userGroupRepository;
    }
}

然后 Ninject 创建 dataContext 实例(如果在此请求范围内没有创建任何实例)。

所以现在的麻烦是 - 在哪里调用 dataContext 方法.Dispose()

UPD:

所以我听从了KeeperOfTheSoul的建议并以这种方式解决了这个问题:

    public override void ReleaseController(IController controller)
    {
        base.ReleaseController(controller);

        var db = kernel.Get<DomainModel.Entities.db>();
        db.Dispose();
    }

最佳答案

处理这个问题的好地方是 IControllerFactory.ReleaseController ,例如

public override void ReleaseController() {
    base.ReleaseController();
    //Do whatever you need to clean up the IoC container here
}

在 NInject 中,这可以通过使用 activation block 确定范围来处理。 ,在请求开始时创建 Controller 时,您可以将激活 block 存储在 HttpContext 的当前项中,在 ReleaseController 期间您可以检索之前创建的激活 block 并将其释放。

您还可以考虑使用 InScope 并让自定义范围实现 INotifyWhenDispose。之后的用法与激活 block 相同,只不过现在您将范围存储在 HttpContext 的当前项中。

关于asp.net - asp.net mvc 2应用程序中的IoC和dataContext配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2953624/

相关文章:

c# - 从 javascript 调用 C# 代码

c# - 计算托管堆大小及其中的所有对象

java - 垃圾收集器、字符串和 Finalize 困惑

.net - 如何最好地实现 IoC 注入(inject)组件的按 View 生命周期

.net - StructureMap:如何为其所有接口(interface)注册相同的实例

java: Spring:如何将 bean 从一个 ClassPathXMLApplicationContext 传输到另一个?

asp.net - 防止多个用户在 Sharepoint 2010 中编辑同一个列表项

javascript - 如何使用asp.net获取jquery select2标签列表的值?

C#:在并行线程中设置 HttpContext.Current 有什么问题吗?

Android Studio 控制台输出?