Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 属性注入到动作过滤器中_C#_Asp.net Mvc 2_Dependency Injection_Structuremap - Fatal编程技术网

C# 属性注入到动作过滤器中

C# 属性注入到动作过滤器中,c#,asp.net-mvc-2,dependency-injection,structuremap,C#,Asp.net Mvc 2,Dependency Injection,Structuremap,我正在尝试在自定义操作筛选器属性上进行属性注入。它按预期工作,但是,我想在属性本身上使用DI。我的过滤器看起来像这样 [AttributeUsage(AttributeTargets.Class)] public sealed class HeaderFilterAttribute : ActionFilterAttribute { public IMarketService MarketService { get; set; } public override voi

我正在尝试在自定义操作筛选器属性上进行属性注入。它按预期工作,但是,我想在属性本身上使用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";
   }
}
这就是我在引导程序类中使用StructureMap配置属性的方式

            //HeaderFilterAttribute
        IMarketRepository marketRepository = new SqlMarketRepository();
        IMarketService marketService = new MarketService(marketRepository);
        ObjectFactory.Container.Configure(r => r.ForConcreteType<HeaderFilterAttribute>().
                                          Configure.WithProperty("MarketService").
                                          EqualTo(marketService));
//HeaderFilterAttribute
IMarketRepository marketRepository=新的SqlMarketRepository();
IMarketService marketService=新的marketService(marketRepository);
ObjectFactory.Container.Configure(r=>r.ForConcreteType()。
Configure.WithProperty(“MarketService”)。
EqualTo(市场服务);

我的问题是我无法访问SqlMarketRepository,因为我所有的具体类型都是通过DI注入的,我真的不想在我的引导程序中使用具体类型。因此,现在的最终问题是,我如何将MarketService注入到Filter属性中,而不必求助于上述内容:)

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

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

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

我认为您需要一个自定义操作调用程序实现来解析过滤器。你可以从我的公司(大约1/2的地方)挖一个温莎样品。应该有更多的在线可用。我知道我在这个网站上看到过一些


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

MVC3是一种选择吗?这是内置的。我需要在一个月内做出决定,克雷格,我不确定团队是否会批准生产使用预览版:(这正是我需要的。这简直太棒了:)谢谢乔希!我试图尽可能远离ViewData集合:D.强类型在这种情况下不好的原因是什么?因为组合(通过ViewData[])比视图模型的继承更灵活。想象一下,如果您以后想向各种页面添加更多组件(标题、菜单、侧栏、用户配置文件小部件等)。如果你必须将所有这些都融入你的基本视图模型中,它会变得拥挤,你甚至可能不需要每个视图上的所有内容。我将模型纯粹用于渲染的特定视图,然后将其他组件放入ViewData中。示例视图代码:
var headerModel=ViewData[Constants.HeaderData]作为HeaderViewModel