2

web.config私のMVCプロジェクトには、次のものがあります。

<appSettings>
    <add key="MembershipRepository" value="Repo.MembershipRepository"/>
</appSettings>

私はこのようなコードを持っています:

var appSettings = ConfigurationManager.AppSettings; 
string membershipRepositoryClassName = appSettings["MembershipRepository"];
Type membershipRepositoryType = Type.GetType(membershipRepositoryClassName);
IMembershipRepository repository = (IMembershipRepository)Activator.CreateInstance(membershipRepositoryType);

を含むWebアプリケーションがweb.configアセンブリにあるとしWebます。私が与えたコードセグメントはアセンブリにありLibます。クラスMembershipRepositoryはアセンブリにありRepoます。 Webとの両方Libを参照していますRepoLib他のアセンブリへの参照はありません(dllとして参照される可能性があります)。 Repoへの参照がある場合とない場合がありますLib

私はmembershipRepositoryTypeになりますnull。おそらく、であるアセンブリを指定する必要があることを理解していますMembershipRepository。1つの方法は、構成でアセンブリ名を指定することです(このように)。しかし、私は他のいくつかの方法があるべきだと思います。それ以外の場合、構成ファイルからクラス名のみを取得して他のクラスをロードする方法は?たとえば、MembershipProviderクラスは他のアセンブリから問題なくロードされます。

どうすれば同じことができますか。または私ができない場合、なぜ私はできないのですか?

4

2 に答える 2

2

次のMSDNライブラリのドキュメントからType.GetType(String)

typeName:取得するタイプのアセンブリ修飾名。AssemblyQualifiedNameを参照してください。タイプが現在実行中のアセンブリまたはMscorlib.dllにある場合は、名前空間で修飾されたタイプ名を指定するだけで十分です。

この最後の文は、クラス名のみを指定した場合に機能することがある理由を説明しています。実行中のコードがにある場合は、を指定するだけでRepo問題を解決できますMembershipProvider。ただし、わかりやすくするために(そしてパフォーマンスも)、この動作を避け、常にアセンブリ名を指定することをお勧めします。または、タイプを含むへの参照がすでにある場合は、代わりにAssembly呼び出すことができますAssembly.GetType

それでも、どのアセンブリにタイプが含まれているかわからないシナリオが本当にある場合は、現在のAppDomainでロードされているすべてのアセンブリを検索して、Assembly.GetTypeそれぞれを呼び出してみることができます。

Type type = AppDomain.CurrentDomain.GetAssemblies()
    .Select(assembly => assembly.GetType(typeName))
    .First(t => t != null);
于 2012-06-17T16:19:21.120 に答える
1

あなたが探しているのはこのようなものです:

var types = AppDomain.CurrentDomain.GetAssemblies().ToList()
    .SelectMany( s => s.GetTypes() )
    .Where( p => p.Name == membershipRepositoryClassName );

同じ名前の型が複数のアセンブリで宣言される可能性があるため、実際にはリストが返されます。タイプが1つしかない場合は、チェーンの最後に追加する.FirstOrDefault().Single()、チェーンの最後に追加できます。.FirstOrDefault()タイプが存在するかどうかわからない場合に使用し、存在しない場合はnullを返します。.Single()タイプが存在する必要があることが確実であり、タイプが見つからない場合に例外をスローする場合に使用します。

于 2012-06-17T15:52:56.303 に答える