Регистрация универсальных типов в конфигурации Unity - PullRequest
0 голосов
/ 25 декабря 2010

О! это очень странная проблема. Я собираюсь зарегистрировать эти два типа, но работать нечего.

<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))

Любые предложения будут оценены;)

1 Ответ

2 голосов
/ 26 декабря 2010

Обновленный ответ

Причина в том, что EqualityComparer<T> - абстрактный класс, как вы можете видеть в MSDN Unity не может создавать экземпляры абстрактных классов, вы должны предоставить конкретную реализацию.



Первый ответ

Вы настроили свой сервер:

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