首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >温莎城堡和IPrincipal

温莎城堡和IPrincipal
EN

Stack Overflow用户
提问于 2009-07-03 21:34:07
回答 2查看 1.8K关注 0票数 2

可以使用Castle Windsor将IPrincipal注入到我的asp.net mvc控制器中。这篇由Scott Hanselman撰写的文章在注释中包含了使用结构图实现它的代码,但是我不知道如何使用Castle来实现它。

更新:

这是我最终为我的控制器工厂做的。请注意,大部分代码来自Steve Sanderson的Pro ASP.NET MVC书,并添加了以下答案中的代码。

代码语言:javascript
复制
public class WindsorControllerFactory : DefaultControllerFactory
{
    readonly WindsorContainer _container;
    // The constructor:
    // 1. Sets up a new IoC container
    // 2. Registers all components specified in web.config
    // 3. Registers IPrincipal
    // 4. Registers all controller types as components
    public WindsorControllerFactory()
    {
        // Instantiate a container, taking configuration from web.config
        _container = new WindsorContainer(
        new XmlInterpreter(new ConfigResource("castle"))
        );

        _container.AddFacility<FactorySupportFacility>();
        _container.Register(Component.For<IPrincipal>()
          .LifeStyle.PerWebRequest
          .UsingFactoryMethod(() => HttpContext.Current.User));

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

        foreach (var t in controllerTypes)
            _container.AddComponentLifeStyle(t.FullName, t, LifestyleType.Transient);
    }

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-07-04 08:38:15

如果您使用的是Windsor 2.0,则不需要修改ControllerFactory:

代码语言:javascript
复制
var container = new WindsorContainer();
container.AddFacility<FactorySupportFacility>();
container.Register(Component.For<IPrincipal>()
  .LifeStyle.PerWebRequest
  .UsingFactoryMethod(() => HttpContext.Current.User));
// your component registrations...

这只是工厂设施配置的一个包装器。如果您使用的是以前的版本(RC3),则可以使用configure this with XML too

票数 11
EN

Stack Overflow用户

发布于 2009-07-03 21:43:21

你试着让Windsor构建你的IPrincipal,它只需要使用已经存在的那个。通过ControllerFactory中的MicroKernel公开的AddComponentInstance方法将其注入容器。

这显然需要一个自定义的ControllerFactory,但您应该已经有了。

不久前,我为HttpContext做了类似的事情:http://www.tigraine.at/2009/01/21/aspnet-mvc-hide-the-httpcontext-services-with-windsor-and-a-custom-controllerfactory/comment-page-1/#comment-2645

您的控制器工厂可能如下所示:

代码语言:javascript
复制
public IController CreateController(RequestContext requestContext, string controllerName)  
{  
    container.Kernel.AddComponentInstance<IPrincipal>(typeof (IPrincipal),  
                                                           System.Web.HttpContext.Current.User);  
    return (IController) container.Resolve(controllerName);  
}  

(别忘了你的控制器必须是每个web请求的或者临时的,否则你会有麻烦的)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1080915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档