问题实施StructureMap在SharpArchitecture的VB.Net转换
-
23-09-2019 - |
题
我在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 /