我试图从Ninject移动到简单的注射器,但我遇到了一个奇怪的问题,当试图复制与Ninject一起使用的功能。简单的注射器FilterInjection似乎是重新初始化RegisterPerWebRequest注入项目
在Ninject我有其中载有服务:
private readonly ICollection<Message> messages;
此服务被注册为
Bind<INotificationService>().To<NotificationService>()
.InRequestScope();
该服务允许的邮件(UI和错误)将被传递回MVC网站。
这项服务注入ActionFilterAttribute:
kernel.BindFilter<CriticalErrorAttribute>(FilterScope.Last, 1)
.When((context, ad) =>
!string.IsNullOrEmpty(ad.ActionName) &&
ad.ControllerDescriptor.ControllerName.ToLower() != "navigation");
和内OnActionExecuted使用。
由于该服务已使用InRequestScope注册到Ninject,所以推送到消息队列的所有项目都可在Actionfiter中使用。如果有必要,这允许重定向到错误页面(显示严重错误)。
我试着simpleinjector复制此:
container.RegisterPerWebRequest<INotificationService, NotificationService>();
container.RegisterInitializer<CriticalErrorAttribute>(handler =>
{
handler.NotificationService =
container.GetInstance<INotificationService>();
});
注射工作正常,但即使该消息集合包含之前进入ActionFilter的消息,曾经在过滤器的消息集合为空。这就像RegisterPerWebRequest被忽略。
任何帮助解决这个问题,将不胜感激。
你也可以实现一个自定义的IPropertySelectionBehavior来允许Simple Injector强制在属性上注入属性。这可以防止您必须编写自定义初始化程序。如果可以的话,evn明确注册属性。这样他们可以被验证。 – Steven
应该是'FilterProviders.Providers.Add(filterProvider);'? – ajbeaven
@ajbeaven:谢谢。我甚至在'SimpleInjectorFilterAttributeFilterProvider'中修复了一个更重要的bug,这使得它很不可用。 – Steven