Причуды регистрации типа контейнера Unity - PullRequest
0 голосов
/ 28 октября 2010

Я пытаюсь автоматически зарегистрировать все отчеты в едином контейнере.

Все отчеты реализуют IReport, а также имеют атрибут Report (), который определяет заголовок, описание и уникальный ключ (поэтому я могу читать их без создания конкретного класса).

Итак ...

Я получаю такие типы отчетов

Public Shared Function GetClassesWhichimplementInterface(Of T)() As IEnumerable(Of Type)
    Dim InterfaceType = GetType(T)
    Dim Types As IEnumerable(Of Type)

    Types = Reflection.Assembly.GetCallingAssembly.GetTypes()

    Return Types.Where(Function(x) InterfaceType.IsAssignableFrom(x))
End Function

И зарегистрируйте их так:

Public Sub RegisterReports()
    Dim ReportTypes = ReflectionHelper.GetClassesWhichimplementInterface(Of IReport)()
    For Each ReportType In ReportTypes
        ''Previously I was reading the report attribute here and using the defined unique key. I've stopped using this code to remove possible problems while debugging.
        Container.RegisterType(GetType(IReport), ReportType, ReportType.Name)
    Next
End Sub

Существуют типы, возвращаемые вызовом GetClassesWhichimplementInterface(), и вызов Container.RegisterType () выполняется без ошибок. Если я позвоню Container.Resolve(of Interfaces.IReport) сразу после регистрации звонка, я получу следующее исключение:

Resolution of the dependency failed, type = "MyProject.Interfaces.IReport", name = "(none)".
Exception occurred while: while resolving.
Exception is: InvalidOperationException - The current type, MyProject.Interfaces.IReport, is an interface and cannot be constructed. Are you missing a type mapping?
-----------------------------------------------
At the time of the exception, the container was:

  Resolving MyProject.Interfaces.IReport,(none)

Может кто-нибудь сказать мне, почему контейнер не сохраняет регистрацию?

1 Ответ

1 голос
/ 28 октября 2010

Регистрация в контейнере. Дело в том, что вы вызываете метод решимости без передачи именованной регистрации в качестве параметра.

Поскольку все ваши регистрации были выполнены с использованием следующего кода:

Container.RegisterType(GetType(IReport), ReportType, ReportType.Name)

Тогда у всех есть имя. Вы должны указать имя вместе с типом, чтобы разрешить зависимость от контейнера.

Ошибка, которую вы получаете, состоит в том, что не зарегистрировано сопоставление типов без имени.

...