2011-10-20 14 views
3

私はアプリケーションを開発していました。私は、メインプロジェクトのアセンブリを参照することなく、自分の型を解決する統一したい。私はそれを使用して型の登録を構成することによってアセンブリを自動的に読み込むようにしましたが、依存関係を含むアセンブリへの参照を追加しない限りうまくいかないようです。ユニティコンテナはアセンブリを動的にロードできますか?

現在のディレクトリのアセンブリからタイプをロードするワットはありますか?

ありがとうございます!

+0

xml構成を使用していますか? –

答えて

0

助けるために少し遅れかもしれませんが、ユニティ動的にあなたがXMLコンフィギュレーション・アプローチを使用している場合、アセンブリをロードし、各アセンブリを登録して、タイプを登録することができますそれに応じて。私はこのプロセスを、それ以外の非常にDI重いフレームワークへのマイナーな拡張のためにしばらく使用してきました。

あなたはUnityがメインアプリケーションに登録したが、他に定義されているの型を解決するために失敗する問題が発生している場合は、参照されていないアセンブリと参照がが最も可能性が高い「はそれだけwasn意味、アセンブリは、問題を解決しましたアプリケーションの出力ディレクトリにコピーされます。既定では、直接参照されているアセンブリのみが自動的にコピーされます。手動またはビルド後のイベントによってコピーされた場合、または参照されていないアセンブリがアプリケーションの出力ディレクトリに構築されるようにビルドパスをリダイレクトする場合は、になります。

1

これはしばらく前に尋ねられたことですが、答えを探している人は、Unityが実行時にアセンブリを見つけることができることを確認する必要があります。したがって、それらをGACに配置するか、実行可能ファイルと同じディレクトリにアセンブリdllをドロップする必要があります。

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="Dependencies" /> 
    </assemblyBinding> 
</runtime> 

そして、どのように上のコードの一部を探してそこに誰のために:あなたは依存関係のために別のディレクトリを使用してWebアプリケーションを持っている場合は、あなたのweb.configファイル内のプロービングの要素を設定する必要がありますこれを解決するには、次のコードで定義されたディレクトリのすべてのアセンブリを探し、Unityで登録します。

string DependenciesPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Dependencies"); 
string[] Dependencies = Directory.GetFiles(DependenciesPath, DLL_PATTERN); 

Dictionary<Type, Type> pluginMappings = new Dictionary<Type, Type>(); 

//Load Dependency Assemblies 
foreach (string fileName in Dependencies) 
{ 
    string assemblyName = Path.GetFileNameWithoutExtension(fileName); 
    if (assemblyName != null) 
    { 
     Assembly pluginAssembly = Assembly.Load(assemblyName); 

     foreach (Type pluginType in pluginAssembly.GetTypes()) 
     { 
      if (pluginType.IsPublic) //Only look at public types 
      { 
       if (!pluginType.IsAbstract) //Only look at non-abstract types 
       { 
        //Gets a type object of the interface we need the plugins to match 
        Type[] typeInterfaces = pluginType.GetInterfaces(); 
        foreach (Type typeInterface in typeInterfaces) 
        { 
         if (pluginMappings.ContainsKey(typeInterface)) 
         { 
          throw new DuplicateTypeMappingException(typeInterface.Name, typeInterface, pluginMappings[typeInterface], pluginType); 
         } 
         pluginMappings.Add(typeInterface, pluginType); 
        } 
       } 
      } 
     } 
    } 
} 

//Web API resolve dependencies with Unity 
IUnityContainer container = new UnityContainer(); 
foreach (var mapping in pluginMappings) 
{ 
    container.RegisterType(mapping.Key, mapping.Value); 
} 
関連する問題