C# ASP.NET MVC 4 RC与温莎城堡

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

我正在查看ASP.NET MVC 4 RC,但找不到DefaultHttpControllerFactory,甚至找不到IHttpControllerFactory来允许我选择的IoC容器(Castle Windsor)连接到Web Api控制器的框架中。我最终使用了IDependencyResolver,这使得发布组件变得有点棘手,但最终得到了以下结果。在IDependencyResolver拥有释放方法之前,它是否会工作/不会发生内存泄漏? Global.asax的最终结果是:

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的结构,这是否是一种可行的方法。我想我已经正确地理解了温莎文件,但是如果我在某个地方犯了错误,如果有人指出,我将不胜感激。谢谢链接,看起来很有趣。