gpt4 book ai didi

asp.net-mvc - 我的 Razor View 的自定义基本页面类型,如何使用城堡温莎 Autowiring 属性?

转载 作者:行者123 更新时间:2023-12-04 14:17:59 24 4
gpt4 key购买 nike

我的基本页面如下所示:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com