Реализация задач StructureMap в преобразовании VB.Net SharpArchitecture

Я работаю в среде VB.Net и был недавно определен задачу с созданием среды MVC для использования в качестве основы для работы от. Я решил преобразовать последний выпуск SharpArchitecture (3 квартал 2009) в VB, который в целом пошел прекрасный после небольшого количества получения по запросу волос. Я столкнулся с проблемой с замком Windsor, где мой пользовательский интерфейс репозитория (живет в базовом/доменном проекте), который был ссылкой в конструкторе моего тестового контроллера, не становился введенным с конкретной реализацией (из проекта данных). Я врезался в кирпичную стену с этим, так в основном решил выключить замок Windsor для StructureMap.

Я думаю, что реализовал это хорошо, поскольку все компилирует и работает, и мой контроллер работал хорошо при ссылке на пользовательский интерфейс репозитория. Это появляется теперь, когда я/или, не может теперь установить мои универсальные интерфейсы правильно (я надеюсь, что это имеет смысл, насколько я плохо знаком со всем этим). Когда я использую IRepository (T) (желание, чтобы это было введено с конкретной реализацией Репозитория (Типа)) в конструкторе контроллера, я получаю следующую ошибку периода выполнения:

"Код исключения StructureMap: 202 Никаких Экземпляра по умолчанию не определяются для PluginFamily SharpArch. Ядро. PersistenceSupport. IRepository '1 [[DebtRemedy. Ядро. Страница, DebtRemedy. Ядро, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], SharpArch. Ядро, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b5f559ae0ac4e006"

Вот мои выборки кода, которые я использую (мой проект называют DebtRemedy).

Мой structuremap класс реестра

Public Class DefaultRegistry
    Inherits Registry

    Public Sub New()
        ''//Generic Repositories
        AddGenericRepositories()
        ''//Custom Repositories
        AddCustomRepositories()
        ''//Application Services
        AddApplicationServices()
        ''//Validator
        [For](GetType(IValidator)).Use(GetType(Validator))
    End Sub

    Private Sub AddGenericRepositories()
        ''//ForRequestedType(GetType(IRepository(Of ))).TheDefaultIsConcreteType(GetType(Repository(Of )))
        [For](GetType(IEntityDuplicateChecker)).Use(GetType(EntityDuplicateChecker))
        [For](GetType(IRepository(Of ))).Use(GetType(Repository(Of )))
        [For](GetType(INHibernateRepository(Of ))).Use(GetType(NHibernateRepository(Of )))
        [For](GetType(IRepositoryWithTypedId(Of ,))).Use(GetType(RepositoryWithTypedId(Of ,)))
        [For](GetType(INHibernateRepositoryWithTypedId(Of ,))).Use(GetType(NHibernateRepositoryWithTypedId(Of ,)))
    End Sub

    Private Sub AddCustomRepositories()
        Scan(AddressOf SetupCustomRepositories)
    End Sub

    Private Shared Sub SetupCustomRepositories(ByVal y As IAssemblyScanner)
        y.Assembly("DebtRemedy.Core")
        y.Assembly("DebtRemedy.Data")
        y.WithDefaultConventions()
    End Sub

    Private Sub AddApplicationServices()
        Scan(AddressOf SetupApplicationServices)
    End Sub

    Private Shared Sub SetupApplicationServices(ByVal y As IAssemblyScanner)
        y.Assembly("DebtRemedy.ApplicationServices")
        y.With(New FirstInterfaceConvention)
    End Sub

End Class

Public Class FirstInterfaceConvention
    Implements ITypeScanner

    Public Sub Process(ByVal type As Type, ByVal graph As PluginGraph) Implements ITypeScanner.Process
        If Not IsConcrete(type) Then
            Exit Sub
        End If
        ''//only works on concrete types
        Dim firstinterface = type.GetInterfaces().FirstOrDefault()
        ''//grabs first interface
        If firstinterface IsNot Nothing Then
            graph.AddType(firstinterface, type)
        Else
            ''//registers type
            ''//adds concrete types with no interfaces
            graph.AddType(type)
        End If
    End Sub
End Class

Я попробовал оба ForRequestedType (который я думаю, теперь удерживается от использования), и Для. IRepository (T) живет в SharpArch. Ядро. PersistenceSupport. Репозиторий (T) живет в SharpArch. Данные. NHibernate.

Мой servicelocator класс

    Public Class StructureMapServiceLocator
    Inherits ServiceLocatorImplBase
    Private container As IContainer

    Public Sub New(ByVal container As IContainer)
        Me.container = container
    End Sub

    Protected Overloads Overrides Function DoGetInstance(ByVal serviceType As Type, ByVal key As String) As Object
        Return If(String.IsNullOrEmpty(key), container.GetInstance(serviceType), container.GetInstance(serviceType, key))
    End Function

    Protected Overloads Overrides Function DoGetAllInstances(ByVal serviceType As Type) As IEnumerable(Of Object)
        Dim objList As New List(Of Object)
        For Each obj As Object In container.GetAllInstances(serviceType)
            objList.Add(obj)
        Next
        Return objList
    End Function
End Class

Мой controllerfactory класс

    Public Class ServiceLocatorControllerFactory
    Inherits DefaultControllerFactory

    Protected Overloads Overrides Function GetControllerInstance(ByVal requestContext As RequestContext, ByVal controllerType As Type) As IController
        If controllerType Is Nothing Then
            Return Nothing
        End If

        Try
            Return TryCast(ObjectFactory.GetInstance(controllerType), Controller)
        Catch generatedExceptionName As StructureMapException
            System.Diagnostics.Debug.WriteLine(ObjectFactory.WhatDoIHave())
            Throw
        End Try
    End Function

End Class

Инициализировать материал в моем global.asax

Dim container As IContainer = New Container(New DefaultRegistry)
ControllerBuilder.Current.SetControllerFactory(New ServiceLocatorControllerFactory())

ServiceLocator.SetLocatorProvider(Function() New StructureMapServiceLocator(container))

Мой тестовый контроллер

Public Class DataCaptureController
Inherits BaseController

Private ReadOnly clientRepository As IClientRepository()
Private ReadOnly pageRepository As IRepository(Of Page)

Public Sub New(ByVal clientRepository As IClientRepository(), ByVal pageRepository As IRepository(Of Page))
    Check.Require(clientRepository IsNot Nothing, "clientRepository may not be null")
    Check.Require(pageRepository IsNot Nothing, "pageRepository may not be null")
    Me.clientRepository = clientRepository
    Me.pageRepository = pageRepository
End Sub

Function Index() As ActionResult
    Return View()
End Function

Вышеупомянутое хорошо работает, когда я вынимаю все, чтобы сделать с pageRepository, который является IRepository (T).

Любая справка с этим значительно ценилась бы.

8
задан mdb 27 July 2010 в 17:37
поделиться

3 ответа

Вчера у меня была аналогичная проблема с созданием экземпляра IRepository (Of MyEntity).

Мне пришлось указать y.ConnectImplementationsToTypesClosing (GetType (IRepository (Of))) в моем делегате сканирования, чтобы сделать общие типы структурной карты сопоставлением с их реализацией.

Вот так:

Private Shared Sub SetupCustomRepositories(ByVal y As IAssemblyScanner)
    y.Assembly("DebtRemedy.Core")
    y.Assembly("DebtRemedy.Data")
    y.WithDefaultConventions()
    y.ConnectImplementationsToTypesClosing(GetType(Of ));
End Sub
1
ответ дан 6 December 2019 в 01:39
поделиться

Убедитесь, что вы создаете только один контейнер.

Я также преобразовал проект C# из Castle Windsor в StructureMap. Исходный проект на основе CW создал экземпляр контейнера в Application_Start() (проект MVC2) и передал его для настройки. Я придерживался того же подхода, не задумываясь, вроде как, когда вы переводите с испанского на английский дословно, и это так же плохо. :)

В итоге я создал второй контейнер SM. Контейнер StructureMap статичен, поэтому он всегда находится «в фоновом режиме». Если вы создаете новый контейнер, вы фактически создаете второй независимый контейнер. если вы не будете осторожны, вы в конечном итоге иногда используете один, иногда другой, и получаете кучу ошибок «Нет экземпляра по умолчанию» в разных точках, когда вы знаете, что он определен.

Я столкнулся с этим так, что в итоге я засорил свой код вызовами WhatDoIHave(), что мне повезло, потому что я заметил, что иногда я видел сконфигурированный контейнер (второй), а иногда я видел статический (первый ), который не был настроен. Различные имена GUID были бесплатной раздачей.

Проверьте, не происходит ли то же самое в вашем коде VB.

1
ответ дан 6 December 2019 в 01:39
поделиться

Не очень знаком с этим, но похоже, что он может быть не зарегистрирован в контейнере или из-за жадности преобразователя он может выбрать конструктор, у которого нет зарегистрированных элементов. Следующий URL-адрес очень похож на ту же проблему, взгляните... http://learningbyfailing.com/2010/02/structuremap-exception-no-default-instance-defined-for-pluginfamily-iformsauthentication/

0
ответ дан 6 December 2019 в 01:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: