我的基页看起来像:
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>
我怎样才能使用Castle连接SomeHelper.
现在回来是null,我已经连接了ISomeHelper,并且我的控制器/存储库/服务类的工作正常.
我猜这个WebViewPage是在我的容器无法访问的地方调用的(比如在控制器级别).
我如何让它工作?
解决方法
关于依赖注入这样的自定义网页的第一件事是你不能使用构造函数注入.很遗憾,我希望他们在未来的版本中能够改进这一点.原因是实现它的实际类是由ASP.NET引擎在运行时动态发出的.
所以我们目前只能使用属性注入.
因此,一种可能性是使用自定义IDependencyResolver.不幸的是IDependencyResolver doesn’t play nice with Castle Windsor.例如,与Ninject相比,本来就是小菜一碟.您所要做的就是使用[Inject]属性修饰SomeHelper属性:
[Inject] public ISomeHelper SomeHelper { get; set; }
并且它将由Ninject自动连接,因为它使用自定义IDependencyResolver.我担心温莎你必须手动这样做.因此,您可以在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中发挥得非常好.