我在创建一个ASP.Net MVC的网站自定义成员提供程序的过程。提供商正在创建一个单独的类作为一个更大的库的一部分。有必要对后端数据存储是灵活的,因为它可能是一个XML文件或SQL数据库。我的最初的想法是创建用于数据存储的接口,并使用依赖注入注入到这个提供商

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

但是通过我自己缺乏技能的我无法弄清楚如何将其添加到网站时注入类到会员的供应商?需要做的数据存储链接到提供什么?什么是在网站上启用这个最简单的方法是什么?

有帮助吗?

解决方案

如果您通过在Web.config文件中的<会员>元素配置自定义的成员提供者,那么我可以看到你将有依赖注入的问题。

在提供商被构造和由框架管理,并且没有机会让你拦截结构以提供额外的依赖注入用于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()将被框架调用它构造你的供应商的实例后,所以这是做任何额外的设置工作的理想场所,如这一点。

有关测试场景,您只需设置上提供实例本身数据存储属性,你会在你的测试直接构建它。

其他提示

这不是更好吗?我用它来与MVC3和ninject。这足以属性添加到您的自定义成员资格提供程序类。记住要加上“使用System.Web.Mvc;”在顶部。

public IRepository Repository
{
    get
    {
        return DependencyResolver.Current.GetService<IRepository>();
    }
}

做的依赖注入,我已经看到了(实际上是唯一一个至今我用...)最简单的方法是让你依赖的类的构造函数把接口作为参数,并将其分配私人领域。如果你愿意,你还可以添加一个“默认”的构造,其中链的第一个具有缺省值。

简化,它看起来是这样的:

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图案的

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top