如何使用Simple Injector在ASP.NET HttpModule中正确地注入构造函数/属性

我有一个名为UsersOnlineModule的类,它是从IHttpModul创建的。 在这个类中,我希望注入两个属性,我正在使用Simple Injector 。

 public class UsersOnlineModule { public ITenantStore tenantStore; public ICacheManager cm; 

我从IHttpModule调用这个类:

 Modules.UsersOnline.UsersOnlineModule usersOnlineModule = new Modules.UsersOnline.UsersOnlineModule(); usersOnlineModule.TrackUser(app.Context); 

但是我的IHttpModule不了解缓存管理器或tenantStore 。 我可以通过从容器中获取对象来解决这个问题,但是我不想创建对Simple Injector的引用。 有没有其他不错的选择来解决这两个属性而不创建对我的容器的引用?

– 更新

我修改了这个例子如下:

 class ImportAttributePropertySelectionBehavior : IPropertySelectionBehavior { public bool SelectProperty(Type serviceType, PropertyInfo propertyInfo) { return typeof(IHttpModule).IsAssignableFrom(serviceType) && propertyInfo.GetCustomAttributes().Any(); } } private static void RegisterHttpModules(Container container) { var httpModules = from assembly in BuildManager.GetReferencedAssemblies().Cast() where !assembly.IsDynamic where !assembly.GlobalAssemblyCache from type in assembly.GetExportedTypes() where type.IsSubclassOf(typeof(IHttpModule)) select type; httpModules.ToList().ForEach(container.Register); } 

但它没有返回任何我的httpmodules。

集成指南显示了如何使用HttpModule初始化HttpHandlers 。 但是,每次请求都不会创建HttpModule; 它为应用程序创建一次,并在调用其初始化方法时注册到HttpApplication的事件。

由于模块是单例,因此不应将依赖项注入模块。 您应该解决每个请求的依赖关系,并且由于无法配置HttpModule并且它不是它自己的依赖项,因此您必须从HttpModule回调到容器中。 实际上没有别的办法,但这里的诀窍是尽量减少所需的代码量。 例:

 public class UsersOnlineModule : IHttpModule { public void Init(HttpApplication context) { context.PreRequestHandlerExecute += (s, e) => { var handler = Global.GetInstance(); handler.Handle(); }; } } 

在此示例中, UsersOnlineModule执行解析一个服务并在其上调用其方法。 此服务(在本例中为UsersOnlineHandler )应捕获所需的所有逻辑和依赖项。 换句话说,你的HttpModule变成了一个简单的对象 ,所有的逻辑被提取到UsersOnlineHandler

 public class UsersOnlineHandler { private readonly ITenantStore tenantStore; private readonly ICacheManager cm; public UsersOnlineHandler(ITenantStore tenantStore, ICacheManager cm) { this.tenantStore = tenantStore; this.cm = cm; } public void Handle() { // logic here } } 

警告: 请确保不要将任何依赖项存储到HttpModule的类或实例字段或属性中,因为这可能会导致依赖项成为强制依赖项 。 相反,如上所述,只需解决,使用和忘记该依赖关系,所有这些都在该方法调用中。 不要存放它。