C# 带有RegisterMvcAttributeFilterProvider的简单注入器不注入自定义属性
我正在将当前的项目从AutoFac转换为Simple Injector,但我无法使它适用于我的MVC操作过滤器。MyC# 带有RegisterMvcAttributeFilterProvider的简单注入器不注入自定义属性,c#,asp.net-mvc-4,action-filter,simple-injector,C#,Asp.net Mvc 4,Action Filter,Simple Injector,我正在将当前的项目从AutoFac转换为Simple Injector,但我无法使它适用于我的MVC操作过滤器。MyUserProfileProc属性类包含类型为IUserProfile的UserProfile,但未将其注入;它的值为空 我的动作代码是这样的 public class UserProfileProc : ActionFilterAttribute { IUserProfile UserProfile; public override void OnActionExecu
UserProfileProc
属性类包含类型为IUserProfile
的UserProfile
,但未将其注入;它的值为空
我的动作代码是这样的
public class UserProfileProc : ActionFilterAttribute
{
IUserProfile UserProfile;
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var response = filterContext.HttpContext.Response;
UserLoginInfo userinfo = UserProfile.GetUserInfo(); .....
}
}
更新1:
我将IUserProfile更改为公共属性,当运行UserProfile.GetUserInfo()时,该属性表示为null
更新2:
我目前的临时解决方案是:
public class UserProfileProc : ActionFilterAttribute
{
public IUserProfile UserProfile {
get {
return DependencyResolver.Current.GetService<IUserServer>();
}
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var response = filterContext.HttpContext.Response;
UserLoginInfo userinfo = UserProfile.GetUserInfo(); .....
}
}
公共类UserProfileProc:ActionFilterAttribute
{
公共IUserProfile用户配置文件{
获取{
返回DependencyResolver.Current.GetService();
}
}
公共覆盖无效OnActionExecuting(ActionExecutingContext filterContext)
{
var response=filterContext.HttpContext.response;
UserLoginInfo userinfo=UserProfile.GetUserInfo()。。。。。
}
}
我的注入器简单注入器初始化器类是
public static class SimpleInjectorInitializer
{
public static void Initialize()
{
var container = new Container();
InitializeContainer(container);
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.RegisterMvcAttributeFilterProvider();
container.Verify();
DependencyResolver.SetResolver(
new SimpleInjectorDependencyResolver(container));
}
private static void InitializeContainer(Container container)
{
container.Register<IAppClientServer, AppClientServer>();
container.Register<IUserProfile, UserProfile \>();
container.Register<ILogger, NLogLogger>();
....
}
}
公共静态类SimpleInjector初始值设定项
{
公共静态void Initialize()
{
var container=新容器();
初始化容器(容器);
container.RegisterMvcControllers(Assembly.getExecutionGassembly());
container.RegisterMvcAttributeFilterProvider();
container.Verify();
DependencyResolver.SetResolver(
新的SimpleInjectorDependencyResolver(容器));
}
私有静态void InitializeContainer(容器)
{
container.Register();
container.Register();
container.Register();
....
}
}
您没有将UserProfile
定义为UserProfileProc
上的属性,并且它不是公共的。调用RegisterMvcAttributeFilterProvider
时,只有带有公共setter的公共实例属性才会注入属性。所有其他的事情都被默默地忽略了
有关将
RegisterMvcAttributeFilterProvider
与隐式属性注入一起使用的另一种方法,请参阅此。有关Simple Injector中属性注入的详细信息,请阅读。我更改了如下代码:public IUserProfile UserProfile{get;set;},现在UserProfile是公共属性,但我测试时get UserProfile为null。@Ericyu67当您直接从容器请求IUserProfile
时会发生什么?例如:container.GetInstance()
。这会引发异常吗?目前,我的临时解决方案就像你说的那样,确实有效。但这似乎是错误的代码,如果可能的话,我想让注入工作。@Ericyu67:你目前的临时解决方案是什么?在我看来,使用隐式属性注入(可以跳过属性而不会失败)是不好的,因为它导致了现在的情况。在我看来,最好的解决方案是将元数据(属性)从其行为中分离出来。我根据您的第一个注释集更改了代码,将其设置为公共属性,但id不起作用。所以我在Update2中使用了我的临时解决方案,它确实可以工作,但我所说的代码看起来很糟糕。
public static class SimpleInjectorInitializer
{
public static void Initialize()
{
var container = new Container();
InitializeContainer(container);
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.RegisterMvcAttributeFilterProvider();
container.Verify();
DependencyResolver.SetResolver(
new SimpleInjectorDependencyResolver(container));
}
private static void InitializeContainer(Container container)
{
container.Register<IAppClientServer, AppClientServer>();
container.Register<IUserProfile, UserProfile \>();
container.Register<ILogger, NLogLogger>();
....
}
}