我正在尝试使用Property Injection处理自定义操作过滤器属性。它本来应该工作,但是,我想在Property本身上使用DI。我的过滤器看起来像这样
[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<HeaderFilterAttribute>().
Configure.WithProperty("MarketService").
EqualTo(marketService));
我的问题是我无法访问SqlMarketRepository,因为我的所有具体类型都是通过DI注入的,我真的不想在我的引导程序中使用具体类型。所以现在最终的问题是,如何在不诉诸上述的情况下将MarketService注入Filter属性? :)
答案 0 :(得分:4)
在ObjectFactory.Initialize()调用中,添加以下行:
SetAllProperties(x => x.OfType<IMarketService>());
这会将配置的IMarketService实例注入到从容器中检索到的任何对象上的IMarketService类型的任何属性。
答案 1 :(得分:1)
我认为你需要一个自定义动作调用器实现来解决过滤器。您可以从我公司的implementation(约1/2左右)中挖出温莎样本。应该有几个在线可用。我知道我在这个网站上看过一些。
PS。我注意到你正在使用基本视图模型来填充标题。我建议在视图模型中使用带有静态键的ViewData []集合而不是继承。 :)