UnityIoCでアセンブリの動的な読み込みと登録を実装しています。
これらのクラスを考えると:
public interface IA { }
public interface IB { }
public interface IC { }
public class A : IA { }
public class B : IB
{
public B(IA a) { }
}
public class C : IC
{
public C(IB b) { }
}
そしてこの構成:
var Assembly = Assembly.LoadFile(@"path\MyAsm.dll");
container.RegisterTypes(
AllClasses.FromAssemblies(Assembly),
WithMappings.FromAllInterfacesInSameAssembly,
WithName.Default,
WithLifetime.Transient);
コード:
var c = container.Resolve(typeof(IC));
スロー:
タイプ 'Microsoft.Practices.Unity.ResolutionFailedException'の最初のチャンスの例外がMicrosoft.Practices.Unity.dllで発生しました
追加情報:依存関係の解決に失敗しました。タイプ= "MyAsm.IC"、名前= "(なし)"。
例外が発生しました:解決中。
例外は次のとおりです。InvalidOperationException-タイプICにはアクセス可能なコンストラクターがありません。
例外の時点で、コンテナは次のとおりでした。
MyAsm.IC、(なし)
上記のコードはすべて、同じアセンブリMyAsmで実行されます。デバッグ中のコンテナを分析すると、Registrations
プロパティは、それぞれのインターフェイスへのA
、B
、およびC
のマッピングの適切なコレクションと思われるものを一覧表示します。自分自身として。
何か案は?
[〜#〜]ソリューション[〜#〜]
タイラーの応答の後、私は変更しました:
var Assembly = Assembly.LoadFile(@"path\MyAsm.dll");
に
var Assembly = Assembly.LoadFrom(@"path\MyAsm.dll");
これで問題は解決しました。 Assembly
のこれら2つのメソッドは、同じ引数と同じ戻り値の型を持ち、 動作がわずかに異なります 。 純粋な悪。
私はあなたが得ているエラーを再現することができました。
したがって、ファイルAssembly.LoadFile(@"path\MyAsm.dll");
からアセンブリをロードしてから、ハード参照された型container.Resolve(typeof(IC));
を解決します。これらのタイプは、2つの異なるコンパイル済みバイナリからのものであると思います。 @ "path\MyAsm.dll"のバイナリの型がコンテナに読み込まれますが、アプリケーションパスのbinディレクトリからバイナリの型を解決しようとしています(参照アセンブリCopyLocalがTrueに設定されています)。
アプリドメインにすでに読み込まれている参照バイナリから型を登録するか、リフレクションを使用して読み込まれたバイナリから型を解決して型を見つける必要があります。
var Assembly = AppDomain.CurrentDomain.GetAssemblies().
SingleOrDefault(asm => asm.GetName().Name == "MyAsm");
...
var c = container.Resolve(typeof(IC));
-または-
var Assembly = Assembly.LoadFile(@"path\MyAsm.dll");
...
var c = container.Resolve(Assembly.GetType("MyAsm.IC"));
Unity.configのインターフェイスとリポジトリをマッピングして解決した方法
<alias alias="IUserRepository" type="pHAB.Repository.Contract.IUserRepository, pHAB.Repository" />
<alias alias="UserRepository" type="pHAB.Repository.UserRepository, pHAB.Repository" />
<container>
<register type="IUserRepository" mapTo="UserRepository"/>
</container>
これも試してみてください。
Debug -> Windows -> Exception Settings
「共通言語ランタイム例外」のチェックを外して、再試行してください。