Asp.net mvc 4 使用structuremap到Asp.Net MVC ActionFilter的SetterProperty注入

Asp.net mvc 4 使用structuremap到Asp.Net MVC ActionFilter的SetterProperty注入,asp.net-mvc-4,dependency-injection,structuremap,actionfilterattribute,Asp.net Mvc 4,Dependency Injection,Structuremap,Actionfilterattribute,为什么我不能通过StructureMap将SetterProperty注入MVC ActionFilter public class LockProjectFilter : ActionFilterAttribute { [SetterProperty] public ISecurityService SecurityService { get; set; } public override void OnActionExecuting(

为什么我不能通过
StructureMap
SetterProperty
注入MVC ActionFilter

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;
    }
公共类LockProjectFilter:ActionFilterAttribute
{
[SetterProperty]
公共ISecurityService安全服务{get;set;}
公共覆盖无效OnActionExecuting(ActionExecutingContext filterContext)
{
var loggedinStaffId=SecurityService.GetLoggedInStaffId();
if(loggedinStaffId==1)
抛出新ArgumentNullException();
base.OnActionExecuting(filterContext);
}
}
公共静态IContainer初始化()
{
ObjectFactory.Initialize(x=>
{
x、 扫描(扫描=>
{
扫描。卡入总成();
scan.WithDefaultConventions();
scan.AssemblyContainingType();
});
x、 SetAllProperties(p=>p.OfType());
//x、 ForConcreteType().Configure
//.Setter(c=>c.SecurityService).IsTheDefault();
});
返回ObjectFactory.Container;
}

您需要利用ObjectFactory之外的“构建”方法

希望这有帮助


wm

亲爱的你的问题帮帮我我的问题我错过了我代码中的[SetterProperty],如果你想查看我的代码,它可以工作,然后按照链接它有完整的细节这就像一个符咒一样工作,只要注入的属性是公共的(在这方面花费了半个小时,而如果没有发现设置公共属性,注入会无声地失败)。
[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);
    }
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);
    }