我的基本页面如下所示:
namespace ASDF.Mvc.ViewEngines.Razor
{
public abstract class WebViewPage<TModel> : System.Web.Mvc.WebViewPage<TModel>
{
public ISomeHelper SomeHelper { get; set; }
}
}
我的意见/web.config
<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="ASDF.Mvc.ViewEngines.Razor.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
</namespaces>
</pages>
</system.web.webPages.razor>
我怎样才能将其连接起来,以便 SomeHelper 将使用 CaSTLe 连接起来。
现在返回 null,我已经连接了 ISomeHelper,并且对于我的 Controller /存储库/服务类来说一切正常 .
我猜这个 WebViewPage 在我的容器无法访问的地方被调用(比如在 Controller 级别)。
我怎样才能让它工作?
最佳答案
关于像这样的自定义网页的依赖注入(inject)的第一件事是你不能使用构造函数注入(inject)。很遗憾,我希望他们会在 future 的版本中改进这一点。原因是实现它的实际类是由 ASP.NET 引擎在运行时动态发出的。
所以我们目前只能使用属性注入(inject)。
因此,一种可能性是使用自定义 IDependencyResolver
.不幸的是 IDependencyResolver doesn't play nice with Castle Windsor .例如,使用 Ninject 将是小菜一碟。您所要做的就是装饰SomeHelper
属性与 [Inject]
属性:
[Inject]
public ISomeHelper SomeHelper { get; set; }
Ninject 会自动连接它,因为它使用自定义的 IDependencyResolver。恐怕在 Windsor 中,您将不得不手动执行此操作。因此,您可以在 Global.asax 中公开您的容器,然后:
public abstract class WebViewPage<TModel> : System.Web.Mvc.WebViewPage<TModel>
{
protected WebViewPage()
{
SomeHelper = MvcApplication.WindsorContainer.Resolve<ISomeHelper>();
}
public ISomeHelper SomeHelper { get; set; }
}
我知道这很糟糕,但恐怕这是残酷的现实。或者也许切换到 Ninject?它与 ASP.NET MVC 3 及其
IDependencyResolver
配合得非常好。 .
关于asp.net-mvc - 我的 Razor View 的自定义基本页面类型,如何使用城堡温莎 Autowiring 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7734826/