属性注入动作filter

我正在尝试使用Property Injection处理自定义操作filter属性。 它应该工作,但是,我想在属性本身使用DI。 我的filter看起来像这样

[AttributeUsage(AttributeTargets.Class)] public sealed class HeaderFilterAttribute : ActionFilterAttribute { public IMarketService MarketService { get; set; } public override void OnActionExecuted(ActionExecutedContext filterContext) { var view = (ViewResultBase)filterContext.Result; if (view != null) { BaseViewModel viewModel = view.ViewData.Model as BaseViewModel; if (viewModel != null) viewModel.Header = GetHeaderScript(); } base.OnActionExecuted(filterContext); } private string GetHeaderScript() { //Use MarketService here and return header script return "script"; } } 

这就是我在BootStrapper类中使用StructureMap配置属性的方法。

  //HeaderFilterAttribute IMarketRepository marketRepository = new SqlMarketRepository(); IMarketService marketService = new MarketService(marketRepository); ObjectFactory.Container.Configure(r => r.ForConcreteType(). Configure.WithProperty("MarketService"). EqualTo(marketService)); 

我的问题是我无法访问SqlMarketRepository,因为我的所有具体类型都是通过DI注入的,我真的不想在我的引导程序中使用具体类型。 所以现在最终的问题是,如何在不诉诸上述的情况下将MarketService注入Filter属性? 🙂

在ObjectFactory.Initialize()调用中,添加以下行:

 SetAllProperties(x => x.OfType()); 

这将把配置的IMarketService实例注入到从容器中检索的任何对象上的IMarketService类型的任何属性。

我认为你需要一个自定义动作调用器实现来解决filter。 您可以从我公司的实施中挖掘一个Windsor样本(大约下降1/2)。 应该有几个在线可用。 我知道我在这个网站上看过一些。

PS。 我注意到你正在使用基本视图模型来填充标题。 我建议在视图模型中使用ViewData []集合和静态键而不是inheritance。 🙂