gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:25:35 25 4
gpt4 key购买 nike

我有 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/

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