【发布时间】:2009-07-03 21:34:06
【问题描述】:
可以使用 Castle Windsor 将 IPrincipal 注入到我的 asp.net mvc 控制器中。 Scott Hanselman 的这篇文章在 cmets 中有代码可以用结构图来做,但我不知道如何用 Castle 做。
更新:
这是我的控制器工厂的最终结果。请注意,大部分代码来自 Steve Sanderson 的 Pro ASP.NET MVC 书籍,并添加了以下答案中的代码。
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);
}
}
【问题讨论】:
-
我不会在控制器工厂中注册设施和 IPrincipal,它们不相关,应该分开。
标签: castle-windsor