如果您通过 Web.config 文件中的 <membership> 元素配置自定义成员资格提供程序,那么我可以看到您在依赖注入时会遇到的问题。
提供者由框架构造和管理,您没有机会拦截该构造来为IDataStore
接口提供额外的依赖注入。
如果我的假设是正确的,那么您可以做的是覆盖Initialize()
自定义提供程序中的方法,并在那里进行依赖注入。您可以在提供程序配置中使用自定义名称/值设置,该设置指向实现的类型,该类型IDataStore
作为字典的一部分传递给Initialize()
方法。
然后,激活数据存储类型的实例并将其设置为适当的属性:
public class MyMembershipProvider : MembershipProvider
{
public IDataStore DataStore
{
get;
set;
}
public override Initialize(string name, NameValueCollection config)
{
var dataStoreType = config["dataStoreProvider"];
if (!String.IsNullOrEmpty(dataStoreType))
{
var type = Type.GetType(dataStoreType);
DataStore = (IDataStore) Activator.CreateInstance(type);
}
}
}
Initialize()
将在框架构造您的提供者的实例后被框架调用,因此这是执行任何额外设置工作的理想场所。
对于测试场景,您只需在提供程序实例本身上设置数据存储属性,因为您将直接在测试中构建它。