简体   繁体   中英

ASP.NET MVC2 Custom Membership Provider w/ Data Provider Interface Issue

I am creating a custom membership provider class library that defines a data provider interface for my web projects to implement.

I am having an issue creating an instance of the class that implements the interface.

I added a line in my web.config to pull the data provider type out, but it is looking for that type inside the membership library (but its defined in my web project).

public class MvcRoleProvider : RoleProvider
{
    public string ConnectionString { get; set; }

    private IDataProvider _dataProvider;

    public override void Initialize(string name, NameValueCollection config)
    {
        var dataProviderType = config["dataProviderType"];
        ConnectionString = ConfigurationManager.AppSettings[config["connectionStringName"]];

        if (!string.IsNullOrEmpty(dataProviderType))
        {
            var type = Type.GetType(dataProviderType, true, true);

            if (type != null && !string.IsNullOrEmpty(ConnectionString))
                _dataProvider = (IDataProvider)Activator.CreateInstance(type, ConnectionString);
        }
    }

Web.config

    <roleManager enabled="true" defaultProvider="WebTestRoleProvider">
  <providers>
    <clear />
    <add name="WebTestRoleProvider"
         applicationName="WebTest"
         type="MvcMembership.MvcRoleProvider, MvcMembership"
         dataProviderType="MyWebNameSpace.MyWebProject.DataProviderClassName"
         connectionStringName="TheConnectionStringName" />
  </providers>
</roleManager>

The error:

Parser Error Message: Could not load type 'MyWebNameSpace.MyWebProject.DataProviderClassName' from assembly 'MvcMembership, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

Am I taking the right approach to this? If I want generic custom membership library, shouldn't I be implementing the appropriate data provider in my web/data projects (in this example I am making one in web for testing)?

I ended up using Assembly.CreateInstance like so:

Factory:

    public class DataProviderFactory
{
    public IDataProvider GetProvider(string assemblyName, string type, string connectionString)
    {
        var assembly = System.Reflection.Assembly.Load(new AssemblyName(assemblyName));
        return (IDataProvider)assembly.CreateInstance(type, true, BindingFlags.CreateInstance, null, new object[]{ connectionString }, null, null);
    }
}

RoleProvider:

 public class MvcRoleProvider : RoleProvider
{
    public string ConnectionString { get; set; }

    private IDataProvider _dataProvider;

    public override void Initialize(string name, NameValueCollection config)
    {
        DataProviderFactory factory = new DataProviderFactory();
        _dataProvider = factory.GetProvider(config["dataProviderAssembly"], config["dataProviderType"], ConfigurationManager.AppSettings[config["connectionStringName"]]);

        base.Initialize(name, config);
    }

With the following settings in web.config:

<roleManager enabled="true" defaultProvider="MvcRoleProvider">
  <providers>
    <clear />
    <add name="MvcRoleProvider"
         applicationName="MyWebNameSpace"
         type="MvcMembership.MvcRoleProvider"
      dataProviderType="MyWebNameSpace.MyWebProject.DataProviderClassName"              dataProviderAssembly="EmailService.Web.EmailAdmin"
         connectionStringName="MyMembershipConnection" />
  </providers>
</roleManager>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM