34

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

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

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

4

3 回答 3

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);
        }
    }
}

Initialize()将在框架构造您的提供者的实例后被框架调用,因此这是执行任何额外设置工作的理想场所。

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

于 2009-10-12T00:02:43.023 回答
20

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

public IRepository Repository
{
    get
    {
        return DependencyResolver.Current.GetService<IRepository>();
    }
}
于 2011-12-04T10:22:22.253 回答
2

我见过的最简单的依赖注入方法(实际上是我迄今为止唯一使用过的方法......)是让依赖类的构造函数将接口作为参数,并将其分配给私有场地。如果需要,您还可以添加一个“默认”构造函数,该构造函数链接到第一个具有默认值的构造函数。

简化后,它看起来像这样:

public class DependentClass
{
    private IDataStore _store;

    // Use this constructor when you want strict control of the implementation
    public DependentClass(IDataStore store)
    {
         this._store = store;
    }

    // Use this constructor when you don't want to create an IDataStore instance
    // manually every time you create a DependentClass instance
    public DependentClass() : this(new DefaultDataStore()) { }
}

这个概念被称为“构造函数链”,网上有很多关于如何做到这一点的文章。我发现本教程对 DI 模式非常有解释性。

于 2009-10-11T23:32:32.503 回答