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);
}