我在VB.Net环境中工作,并且最近被委托创建MVC环境中使用作为基础,从工作。我决定到最新版本SharpArchitecture(Q3 2009)转换为VB,这在整体上有点扯头发后,已经罚款。我碰到一个问题就与温莎城堡在那里,这是在我的测试控制器的构造参考我的自定义库界面(生活在核心/域项目)没有得到与具体实施注射(从数据项目)。我碰壁与此所以基本上决定切换出城堡温莎为StructureMap。

我觉得我已经实现了这个确定为一切编译和运行和我引用一个自定义的库接口时,控制器RAN确定。现在看来,我有/或现在可以设置我的通用接口正确(我希望这是到目前为止意义,因为我是新来的这一切)不行。当我使用IRepository(OF T)在所述控制器构造我得到以下运行时错误(希望它与一个具体的实施库(类型)的被喷射):

<强>“StructureMap异常代码:202没有默认实例PluginFamily SharpArch.Core.PersistenceSupport.IRepository`1 [[DebtRemedy.Core.Page,DebtRemedy.Core,版本= 1.0.0.0,文化=中性公钥定义= NULL]],SharpArch.Core,版本= 1.0.0.0,文化=中性公钥= 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(Of T)已住在SharpArch.Core.PersistenceSupport。 存储库(OF T)生活在SharpArch.Data.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

在INITIALISE东西
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

在上述工程细当我取出一切都与它是IRepository(OF T)的pageRepository。

任何帮助,这将不胜感激。

没有正确的解决方案

其他提示

我昨天也有类似的问题与实例IRepository(OF myEntity所)。

我不得不状态y.ConnectImplementationsToTypesClosing(GetType(IRepository(Of )))我扫描的委托,使StructureMap泛型类型映射到它们的实现。

像这样:

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

请确保您只创建一个容器。

我也转换C#项目从城堡温莎到StructureMap。原来基于CW-项目实例中的Application_Start容器()(MVC2项目),并通过周围它的配置。我保留了同样的做法不加思考,有点当你翻译从西班牙语译成英语litterally,这是一样糟糕。 :)

发生了什么事,是我结束了创建第二个SM容器。 StructureMap的容器是静态的,所以有“背景”总是一个。如果新的一个容器,你实际上创建第二个,独立的容器。如果你不小心,你最终使用,有时一个,有时对方,并获得“无默认实例”在不同的点误差的瘟疫,当你知道它的定义..

我碰到它的方式是,我结束了乱抛垃圾我的WhatDoIHave()调用,这是幸运的,因为我注意到,有时我看到一个可配置的容器(第二),有时我看到静态的(第一码),其没有已配置的。不同的GUID名称是赠品。

检查是否同样是在VB代码发生。

这并不是说熟悉,但它看起来像它可能不与容器注册或因为解析器是贪它可能会选择一个构造函数,没有注册的项目。下面的URL看起来非常相似,同样的问题,看看... http://learningbyfailing.com / 2010/02 / structuremap-异常无默认实例定义换pluginfamily-iformsauthentication /

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top