【发布时间】:2013-08-30 20:52:17
【问题描述】:
我正在尝试使用 Castle Windsor 和依赖注入创建一个 ASP.NET MVC 项目。一切正常,期待以下内容:
全球.asax
Container = new WindsorContainer();
Container.Install(new WebInstaller(), new LoggingInstaller());
var customControllerFactory = new CustomControllerFactory(Container);
ControllerBuilder.Current.SetControllerFactory(customControllerFactory);
Webinstaller 注册 Castle 类:
string connectionStr = GetConnectionString("MainModel");
container.Register(Component.For(typeof(MainModelContainer)).DependsOn(new {
connectionString = connectionStr }).LifestylePerWebRequest());
container.Register(Classes.FromAssemblyContaining<MemberQueries>().InNamespace("User.EF.Queries").WithService.DefaultInterfaces().LifestylePerWebRequest());
container.Register(Classes.FromAssemblyContaining<HomeController>().BasedOn<IController>().LifestylePerWebRequest());
//PROBLEM that doesn't work
container.Register(Classes.FromAssemblyContaining<HomeController>().BasedOn<IAddMessage>().LifestylePerWebRequest());
家庭控制器
public IAddMessage AddMessage { get; set; }
private readonly IMemberQueries _memberContract;
public HomeController(IMemberQueries memberContract)
{
_memberContract = memberContract;
}
public ActionResult Index()
{
//PROBLEM AddMessage is Null and is not resolved automaticaly
AddMessage.Add("Test", MessageTypes.message);
return View("Index");
}
IAddMessage 实现
public class CustomMessage : IAddMessage
{
private IController Controller { get; set; }
public CustomMessage(IController controller)
{
Controller = controller;
}
public void Add(string text, MessageTypes messageTypes)
{
//TODO
}
}
IAddMessage 接口
public interface IAddMessage
{
void Add(string text, MessageTypes messageTypes);
}
问题是,IAddMessage 属性为空,因为容器无法解析 CustomMessage 构造函数中的 IController 依赖项。但我不知道如何解决这个问题。
Castle 容器中的内部错误消息显示如下:
此组件的某些依赖项无法静态解析。 'User.Web.UI.Helper.Messages.CustomMessage' 正在等待以下依赖项: - 未注册的服务“System.Web.Mvc.IController”。
我在网上看了很多,但我找不到任何有用的提示或解决我的问题的方法。
【问题讨论】:
-
我不知道这是否有助于找到解决方案,所以我没有将其标记为答案。当内核通过构造函数参数注册 IAddMessage 的 CustomMessage 实现时,内核将尝试解析 IController。可能 IController 超出范围或需要先注册。
标签: asp.net-mvc dependency-injection castle-windsor