2010-11-08 3 views
1

Я создаю специальную библиотеку классов поставщика членства, которая определяет интерфейс поставщика данных для реализации моих веб-проектов.ASP.NET MVC2 Пользовательский поставщик членства с интерфейсом поставщика данных Проблема

У меня возникла проблема с созданием экземпляра класса, который реализует интерфейс.

Я добавил строку в свой web.config, чтобы вытащить тип поставщика данных, но он ищет этот тип внутри библиотеки членства (но он определен в моем веб-проекте).

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> 

Ошибка:

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

Могу ли я принимать правильный подход к этому? Если мне нужна общая пользовательская библиотека членства, не следует ли мне внедрять соответствующий поставщик данных в моих проектах в области веб-данных (в этом примере я делаю это в Интернете для тестирования)?

ответ

0

Я закончил с использованием Assembly.CreateInstance так:

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

С помощью следующих параметров в 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> 
Смежные вопросы