将属性注入到动作过滤器中

2024-01-09

我正在尝试让属性注入在自定义操作过滤器属性上工作。它按预期工作,但是,我想在属性本身上使用 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 属性中? :)


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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将属性注入到动作过滤器中 的相关文章

随机推荐