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