依赖注入和ASP.Net成员提供商

Bin*_*fit 34 asp.net-mvc dependency-injection data-storage membership-provider

我正在为ASP.Net MVC网站创建自定义成员资格提供程序.作为更大的库的一部分,提供程序被创建为单独的类.后端数据存储需要灵活,因为它可以是Xml文件或SQL数据库.我最初的想法是为数据存储创建一个接口,并使用依赖注入将其注入提供程序.

最终结果是开发人员可以继承数据存储接口并提供更新数据所需的方法,然后由自定义成员资格提供程序使用.

但是,由于我自己缺乏技能,我无法弄清楚如何将该类添加到网站时将其注入会员提供商?将数据存储链接到提供程序需要做些什么?在网站上启用此功能的最简单方法是什么?

Sam*_*Sam 33

如果您通过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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Initialize() 框架在构造提供者的实例后将被调用,因此这是进行任何其他设置工作的理想场所.

对于测试场景,您只需在提供程序实例本身上设置数据存储属性,因为您将直接在测试中构建它.


Mic*_* B. 20

这不是更好吗?我在MVC3和ninject中使用它.将属性添加到自定义成员资格提供程序类就足够了.记得添加"using System.Web.Mvc;" 在上面.

public IRepository Repository
{
    get
    {
        return DependencyResolver.Current.GetService<IRepository>();
    }
}
Run Code Online (Sandbox Code Playgroud)