web-dev-qa-db-ja.com

Unityは基本的な依存関係チェーンの解決に失敗します

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プロパティは、それぞれのインターフェイスへのAB、およびCのマッピングの適切なコレクションと思われるものを一覧表示します。自分自身として。

何か案は?

[〜#〜]ソリューション[〜#〜]

タイラーの応答の後、私は変更しました:

var Assembly = Assembly.LoadFile(@"path\MyAsm.dll");

var Assembly = Assembly.LoadFrom(@"path\MyAsm.dll");

これで問題は解決しました。 Assemblyのこれら2つのメソッドは、同じ引数と同じ戻り値の型を持ち、 動作がわずかに異なります純粋な悪

9
Jacek Gorgoń

私はあなたが得ているエラーを再現することができました。

したがって、ファイル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"));
5
TylerOhlsen

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 

「共通言語ランタイム例外」のチェックを外して、再試行してください。

0
sethu