属性注入动作过滤器

时间:2010-10-06 20:08:34

标签: c# asp.net-mvc-2 dependency-injection structuremap

我正在尝试使用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属性? :)

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:1)

我认为你需要一个自定义动作调用器实现来解决过滤器。您可以从我公司的implementation(约1/2左右)中挖出温莎样本。应该有几个在线可用。我知道我在这个网站上看过一些。

PS。我注意到你正在使用基本视图模型来填充标题。我建议在视图模型中使用带有静态键的ViewData []集合而不是继承。 :)