2010-12-25 3 views
0

ああ!これは非常に奇妙な問題です。私はこれらの2つのタイプを登録するつもりですが、うまくいくものはありません。ユニティタイプでジェネリックタイプを登録する

<unity> 
    <typeAliases> 
     <typeAlias alias="IEqualityComparer`1" 
        type="System.Collections.Generic.IEqualityComparer`1, mscorlib" /> 
     <typeAlias alias="singleton" 
        type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager, Microsoft.Practices.Unity" />    
     <typeAlias alias="EqualityComparer`1" 
        type="System.Collections.Generic.EqualityComparer`1, mscorlib" /> 
    </typeAliases> 
    <containers> 
     <container> 
      <types> 
       <register type="IEqualityComparer`1" 
          mapTo="EqualityComparer`1"> 
        <lifetime type="singleton" /> 
       </register> 
      </types> 
     </container> 
    </containers> 
</unity> 

そして、これは私のコントローラです:コントローラを解決するとき

public class MyController : MyExtendedController { 
    private readonly IEqualityComparer<int> _fakeComparer; 

    public ResourcesController(IEqualityComparer<int> fakeComparer) { 
     _fakeComparer = fakeComparer; 
    } 
} 

、例外はUnityがスローされます。

Resolution of the dependency failed, type = "MyController", name = "(none)". 
Exception occurred while: while resolving. 
Exception is: InvalidOperationException - The type EqualityComparer`1 cannot be constructed. You must configure the container to supply this value. 
----------------------------------------------- 
At the time of the exception, the container was: 
Resolving MyController,(none) 
Resolving parameter "fakeComparer" of constructor MyController(System.Collections.Generic.IEqualityComparer`1[[int, mscorelib]] fakeComparer) 
Resolving System.Collections.Generic.EqualityComparer`1[int, mscorelib],(none) (mapped from System.Collections.Generic.IEqualityComparer`1[int, mscorelib], (none)) 

任意の提案をいただければ幸いです;更新)

答えて

2

答え

理由はEqualityComparer<T>が抽象クラスであることがわかります。on MSDNが表示されます。 Unityは抽象クラスをインスタンス化できません。具体的な実装を提供する必要があります。



最初の答えは、あなたのサーバーを

構成されていました:

var container = new UnityContainer(); 
var section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity"); 
section.Containers.Default.Configure(container); 
+0

私は、configファイルから設定を読み込む/設定に問題を持っていません。私はUnityによって登録されたタイプを解決することに問題があります。私は自分のジェネリックインターフェイス/クラスでこの問題をテストしています。しかし、私はIEqualityComparer/EqualityComparerを仕事にすることはできません。 – Sadegh

+0

"System.Collections.Generic.IEqualityComparer'1、mscorlib"は単純化のため、実際のエイリアス定義は次のようなものです。 "System.Collections.Generic.IEqualityComparer'1、mscorlib、Version = 4.0.0.0、Culture = neutral、 PublicKeyToken = b77a5c561934e089 " – Sadegh

+0

私は参照してください。私は私の答えを更新しました。 – onof