C# ASP.NET MVC 4 RC与温莎城堡
我正在查看ASP.NET MVC 4 RC,但找不到DefaultHttpControllerFactory,甚至找不到IHttpControllerFactory来允许我选择的IoC容器(Castle Windsor)连接到Web Api控制器的框架中。我最终使用了IDependencyResolver,这使得发布组件变得有点棘手,但最终得到了以下结果。在IDependencyResolver拥有释放方法之前,它是否会工作/不会发生内存泄漏? Global.asax的最终结果是:C# ASP.NET MVC 4 RC与温莎城堡,c#,castle-windsor,asp.net-mvc-4,C#,Castle Windsor,Asp.net Mvc 4,我正在查看ASP.NET MVC 4 RC,但找不到DefaultHttpControllerFactory,甚至找不到IHttpControllerFactory来允许我选择的IoC容器(Castle Windsor)连接到Web Api控制器的框架中。我最终使用了IDependencyResolver,这使得发布组件变得有点棘手,但最终得到了以下结果。在IDependencyResolver拥有释放方法之前,它是否会工作/不会发生内存泄漏? Global.asax的最终结果是: public
public class WebApiApplication : System.Web.HttpApplication
{
private IWindsorContainer container;
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
Windsor();
}
protected void Application_End()
{
container.Dispose();
}
private void Windsor()
{
container = new WindsorContainer().Install(FromAssembly.This());
// mvc:
var mvcControllerFactory = new WindsorControllerFactory(container.Kernel);
ControllerBuilder.Current.SetControllerFactory(mvcControllerFactory);
// web api:
var httpDependencyResolver = new WindsorHttpDependencyResolver(container.Kernel);
GlobalConfiguration.Configuration.DependencyResolver = httpDependencyResolver;
}
}
public class WindsorHttpDependencyResolver : System.Web.Http.Dependencies.IDependencyResolver
{
private readonly IKernel kernel;
public WindsorHttpDependencyResolver(IKernel kernel)
{
this.kernel = kernel;
}
public IDependencyScope BeginScope()
{
return kernel.Resolve<IDependencyScope>(); // instances released suitably (at end of web request)
}
public object GetService(Type serviceType)
{
// for ModelMetadataProvider and other MVC related types that may have been added to the container
// check the lifecycle of these registrations
return kernel.HasComponent(serviceType) ? kernel.Resolve(serviceType) : null;
}
public IEnumerable<object> GetServices(Type serviceType)
{
return kernel.HasComponent(serviceType) ? kernel.ResolveAll(serviceType) as IEnumerable<object> : Enumerable.Empty<object>();
}
public void Dispose()
{
// Nothing created so nothing to dispose - kernel will take care of its own
}
}
WindsorController Factory是用于Mvc控制器的DefaultControllerFactory的扩展,并且有一个Windsor安装程序。
WindsorHttpDependencyResolver最终为:
public class WebApiApplication : System.Web.HttpApplication
{
private IWindsorContainer container;
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
Windsor();
}
protected void Application_End()
{
container.Dispose();
}
private void Windsor()
{
container = new WindsorContainer().Install(FromAssembly.This());
// mvc:
var mvcControllerFactory = new WindsorControllerFactory(container.Kernel);
ControllerBuilder.Current.SetControllerFactory(mvcControllerFactory);
// web api:
var httpDependencyResolver = new WindsorHttpDependencyResolver(container.Kernel);
GlobalConfiguration.Configuration.DependencyResolver = httpDependencyResolver;
}
}
public class WindsorHttpDependencyResolver : System.Web.Http.Dependencies.IDependencyResolver
{
private readonly IKernel kernel;
public WindsorHttpDependencyResolver(IKernel kernel)
{
this.kernel = kernel;
}
public IDependencyScope BeginScope()
{
return kernel.Resolve<IDependencyScope>(); // instances released suitably (at end of web request)
}
public object GetService(Type serviceType)
{
// for ModelMetadataProvider and other MVC related types that may have been added to the container
// check the lifecycle of these registrations
return kernel.HasComponent(serviceType) ? kernel.Resolve(serviceType) : null;
}
public IEnumerable<object> GetServices(Type serviceType)
{
return kernel.HasComponent(serviceType) ? kernel.ResolveAll(serviceType) as IEnumerable<object> : Enumerable.Empty<object>();
}
public void Dispose()
{
// Nothing created so nothing to dispose - kernel will take care of its own
}
}
希望这是有用的。我最终使用了来自的代码(由Mark Seemann进一步增强),它为每个请求创建一个作用域,并负责释放创建的对象。这与您所采用的方法略有不同。您的问题是“在IDependencyResolver拥有释放方法之前,它是否会工作/不会出现内存泄漏?”@Jesse我想我正在尝试找出,鉴于MVC 4 RC的结构,这是否是一种可行的方法。我想我已经正确地理解了温莎文件,但是如果我在某个地方犯了错误,如果有人指出,我将不胜感激。谢谢链接,看起来很有趣。