我的目标:在 DI 提供 IFilterProvider 的情况下注入 IFilterProvider,但默认回退到全局 FilterProviders.Providers.GetFilters() 方法。
Internet 上有很多资源(包括“官方”Microsoft 资源)演示了如何将 IFilterProvider 接口注入到一个类中。但是,它们都使用服务定位器反模式(根据 Mark Seeman)来执行此操作。这是我找到的列表:
- http://msdn.microsoft.com/en-us/vs2010trainingcourse_aspnetmvcdependencyinjection_topic4.aspx
- http://merbla.blogspot.com/2011/02/ifilterprovider-using-autofac-for-mvc-3.html
- http://thecodinghumanist.com/blog/archives/2011/1/27/structuremap-action-filters-and-dependency-injection-in-asp-net-mvc-3
- IFilterProvider 和关注点分离
那么这些方法有什么问题呢?它们都将 DI 容器注入到目标类中,而不是相反。如果您在类中看到诸如 container.Resolve() 之类的内容,那么您并没有将对象生命周期的控制权交给 DI 容器,而这正是控制反转的真正意义所在。
此外,尝试创建回退到全局 FilterProviders.Providers 实例的问题在于,尽管它与 IFilterProvider 接口具有相同的签名,但它实际上并未实现该接口。那么如何将全局静态成员作为逻辑默认值注入,并且仍然允许使用 DI 覆盖它呢?