2010-12-25 4 views
0

Oh! это очень странная проблема. Я собираюсь зарегистрировать эти два типа, но работать не стоит.Регистрация типичных типов в конфигурации Unity

<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; 
    } 
} 

И исключение бросков единства при решении контроллера:

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

Я не какой-либо проблемы с настройкой/чтения конфигурации из конфигурационного файла. У меня проблема с разрешением зарегистрированного типа 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

Смежные вопросы