在ASP.NET MVC中设置控制(IOC)的反转与温莎城堡 [英] Setting up Inversion of Control (IoC) in ASP.NET MVC with Castle Windsor

查看:183
本文介绍了在ASP.NET MVC中设置控制(IOC)的反转与温莎城堡的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要在桑德森的临ASP.NET MVC框架,并在第4章,他讨论<一个href=\"http://books.google.com/books?id=tD3FfFcnJxYC&pg=PA97&lpg=PA97&dq=Castle+Windsor+Creating+a+Custom+Controller+Factory&source=bl&ots=IQiNwtzGUy&sig=nFMxJjIshKcMTKjb_JgWN4xB7fo&hl=en&ei=6kloTZG1BYyRgQfgzZTOCg&sa=X&oi=book_result&ct=result&resnum=6&ved=0CDoQ6AEwBQ#v=onepage&q=Castle%20Windsor%20Creating%20a%20Custom%20Controller%20Factory&f=false\">Creating自定义控制器厂,似乎原来的方法, AddComponentLifeStyle AddComponentWithLifeStyle ,用于注册控制器德是$ p $现在pcated:

I'm going over Sanderson's Pro ASP.NET MVC Framework and in Chapter 4 he discusses Creating a Custom Controller Factory and it seems that the original method, AddComponentLifeStyle or AddComponentWithLifeStyle, used to register controllers is deprecated now:

public class WindsorControllerFactory : DefaultControllerFactory
{
    IWindsorContainer container;

    public WindsorControllerFactory()
    {
        container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle")));

        // register all the controller types as transient
        var controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes()
                              where typeof(IController).IsAssignableFrom(t)
                              select t;

        //[Obsolete("Use Register(Component.For<I>().ImplementedBy<T>().Named(key).Lifestyle.Is(lifestyle)) instead.")]
        //IWindsorContainer AddComponentLifeStyle<I, T>(string key, LifestyleType lifestyle) where T : class;
        foreach (Type t in controllerTypes)
        {
            container.Register(Component.For<IController>().ImplementedBy<???>().Named(t.FullName).LifeStyle.Is(LifestyleType.Transient));
        }
    }

    // Constructs the controller instance needed to service each request
    protected override IController GetControllerInstance(Type controllerType)
    {
        return (IController)container.Resolve(controllerType);
    }
}

新的建议是使用<$c$c>Register(Component.For<I>().ImplementedBy<T>().Named(key).Lifestyle.Is(lifestyle)),但我无法弄清楚如何present在 ImplementedBy&LT执行控制器类型; ???&GT;()方法。我试图 ImplementedBy&LT; T&GT;() ImplementedBy&LT; typeof运算(T)&GT;(),但我可以'找不到合适的方式实施类型来传递。任何想法?

The new suggestion is to use Register(Component.For<I>().ImplementedBy<T>().Named(key).Lifestyle.Is(lifestyle)), but I can't figure out how to present the implementing controller type in the ImplementedBy<???>() method. I tried ImplementedBy<t>() and ImplementedBy<typeof(t)>(), but I can't find the appropriate way to pass in the implementing type. Any ideas?

推荐答案

我用这样的<一个href=\"http://msdn.microsoft.com/en-us/library/system.web.mvc.controllerbuilder.setcontrollerfactory.aspx\"><$c$c>ControllerBuilder.SetControllerFactory和code可以在开源项目中找到 MvcContrib

的Global.asax.cs

protected void Application_Start()
{
    ...

    IWindsorContainer windsorContainer = new WindsorContainer();
    windsorContainer.RegisterControllers(Assembly.GetExecutingAssembly());
    ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(windsorContainer));

    ...
}

WindsorControllerFactory

public class WindsorControllerFactory : DefaultControllerFactory
{
    private readonly IWindsorContainer _container;

    public WindsorControllerFactory(IWindsorContainer container)
    {
        if (container == null)
        {
            throw new ArgumentNullException();
        }

        _container = container;
    }

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        if (controllerType == null)
        {
            throw new HttpException();
        }

        if (!typeof(IController).IsAssignableFrom(controllerType))
        {
            throw new ArgumentException();
        }

        try
        {
            return (IController)_container.Resolve(controllerType);
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException();
        }
    }

    public override void ReleaseController(IController controller)
    {
        IDisposable disposable = controller as IDisposable;

        if (disposable != null)
        {
            disposable.Dispose();
        }

        _container.Release(controller);
    }
}

WindsorExtensions (见<一href=\"http://mvccontrib.$c$cplex.com/SourceControl/changeset/view/9f50eec32eb7#src%2fMvcContrib.Castle%2fWindsorExtensions.cs\">MvcContrib)

public static class WindsorExtensions
{
    public static IWindsorContainer RegisterController<T>(this IWindsorContainer container) where T : IController
    {
        container.RegisterControllers(typeof(T));

        return container;
    }

    public static IWindsorContainer RegisterControllers(this IWindsorContainer container, params Type[] controllerTypes)
    {
        foreach (Type type in controllerTypes)
        {
            if (ControllerExtensions.IsController(type))
            {
                container.Register(Component.For(type).Named(type.FullName).LifeStyle.Is(LifestyleType.Transient));
            }
        }

        return container;
    }

    public static IWindsorContainer RegisterControllers(this IWindsorContainer container, params Assembly[] assemblies)
    {
        foreach (Assembly assembly in assemblies)
        {
            container.RegisterControllers(assembly.GetExportedTypes());
        }

        return container;
    }
}

ControllerExtensions (见<一href=\"http://mvccontrib.$c$cplex.com/SourceControl/changeset/view/9f50eec32eb7#src%2fMVCContrib%2fControllerExtensions.cs\">MvcContrib)

public static class ControllerExtensions
{
    public static bool IsController(Type type)
    {
        return type != null
               && type.Name.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)
               && !type.IsAbstract
               && typeof(IController).IsAssignableFrom(type);
    }
}

这篇关于在ASP.NET MVC中设置控制(IOC)的反转与温莎城堡的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆