5

StructureMapでMVC ActionFilterに挿入できないのはなぜですか?StructmapをAsp.Net MVC ActionFilterに使用するSetterPropertyインジェクション

public class LockProjectFilter : ActionFilterAttribute 
    { 
     [SetterProperty] 
     public ISecurityService SecurityService { get; set; } 

     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      var loggedinStaffId = SecurityService.GetLoggedInStaffId(); 
      if (loggedinStaffId == 1) 
       throw new ArgumentNullException(); 
      base.OnActionExecuting(filterContext); 
     } 
    } 


    public static IContainer Initialize() 
    { 
     ObjectFactory.Initialize(x => 
         { 
          x.Scan(scan => 
              { 
               scan.TheCallingAssembly(); 
               scan.WithDefaultConventions(); 
               scan.AssemblyContainingType<ISecurityService>(); 
              }); 
          x.SetAllProperties(p => p.OfType<ISecurityService>()); 
          //x.ForConcreteType<LockProjectFilter>().Configure 
           // .Setter(c => c.SecurityService).IsTheDefault(); 
         }); 
     return ObjectFactory.Container; 
    } 
+0

各位/ question/23386344/asp-net-mvc-5-custom-action-filter-with-structuremap – Developerzzz

答えて

9

ObjectFactoryから 'BuildUp'メソッドを使用する必要があります。

http://docs.structuremap.net/ConstructorAndSetterInjection.htm#section4

[Test] 
    public void create_a_setter_rule_and_see_it_applied_in_BuildUp_through_ObjectFactory() 
    { 
     var theGateway = new DefaultGateway(); 
     ObjectFactory.Initialize(x => 
     { 
      x.ForRequestedType<IGateway>().TheDefault.IsThis(theGateway); 

      // First we create a new Setter Injection Policy that 
      // forces StructureMap to inject all public properties 
      // where the PropertyType is IGateway 
      x.SetAllProperties(y => 
      { 
       y.OfType<IGateway>(); 
      }); 
     }); 

     // Create an instance of BuildUpTarget1 
     var target = new BuildUpTarget1(); 

     // Now, call BuildUp() on target, and 
     // we should see the Gateway property assigned 
     ObjectFactory.BuildUp(target); 

     target.Gateway.ShouldBeTheSameAs(theGateway); 
    } 

次に、あなたがこのような新しいFilterAttributeFilterProvider作成することができます。そして、最終的には.NETパイプラインにカスタムフィルタプロバイダを追加

public class DependencyResolverFilterProvider : FilterAttributeFilterProvider 
{ 
    public override IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor) 
    { 
     var filters = base.GetFilters(controllerContext, actionDescriptor); 

     foreach (var filter in filters) 
     { 
      //DI via Setter Injection 
      DependencyResolver.BuildUp(filter.Instance); 
     } 

     return filters; 
    } 
} 

を。

private static void RegisterProviderAndFilters() 
    { 
     var oldProvider = FilterProviders.Providers.Single(f => f is FilterAttributeFilterProvider); 
     FilterProviders.Providers.Remove(oldProvider); 
     FilterProviders.Providers.Add(new DependencyResolverFilterProvider()); 

     RegisterGlobalFilters(GlobalFilters.Filters); 
    } 

あなたの質問は、あなたが私のコードを見たいならば、それは完全な詳細を持っているhttp://stackoverflow.comリンクをたどって、私は私のコードで[SetterProperty]を欠場し、それが仕事私の問題私は私を助けて

WM

+0

これは、注入されたプロパティがpublicであれば、魅力的な働きをします(半時間を費やしています。プロパティが設定されていることがわかります)。 –

関連する問題