سؤال

أنا أعمل في بيئة VB.NET وتم تكليفها مؤخرًا بإنشاء بيئة MVC لاستخدامها كقاعدة للعمل منها. قررت تحويل أحدث إصدار من البنية (Q3 2009) إلى VB ، والذي أصبح على نحو جيد بعد قليل من سحب الشعر. صادفت مشكلة مع Castle Windsor حيث لم يتم حقن واجهة مستودعك المخصصة (Living in the Core/Domain Project) التي كانت مرجعية في مُنشئ وحدة تحكم الاختبار الخاصة بي مع تطبيق الملموسة (من مشروع البيانات). لقد ضربت جدارًا من الطوب مع هذا ، لذلك قررت بشكل أساسي تبديل Windsor Castle for structuremap.

أعتقد أنني قمت بتطبيق هذا موافق حيث يقوم كل شيء بتجميع ويدير وتشغيل وحدة التحكم الخاصة بي بشكل جيد عند الرجوع إلى واجهة مستودع مخصصة. يبدو الآن أن لدي/أو لا أستطيع الآن إعداد واجهاتي العامة بشكل صحيح (آمل أن يكون هذا منطقيًا بقدر ما أنا جديد على كل هذا). عندما أستخدم iRepository (من T) (الرغبة في حقنه بتنفيذ ملموسة للمستودع (من النوع)) في مُنشئ وحدة التحكم ، أحصل على خطأ في وقت التشغيل التالي:

"رمز الاستثناء الهيكلي: 202 لا يوجد مثيل افتراضي محدد لـ pluginfamily sharparch.core.persistencesupport.irepository`1 [[debtremedy.core.page ، debtremedy.core ، الإصدار = 1.0.0.0 .core ، الإصدار = 1.0.0.0 ، الثقافة = محايد ، publickeytoken = b5f559ae0ac4e006 "

فيما يلي مقتطفات الكود التي أستخدمها (يسمى مشروعي Debtremedy).

فصل السجل الخاص بي

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.core.persistencesupport. مستودع (من 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

بلدي وحدة التحكم

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

أي مساعدة مع هذا موضع تقدير كبير.

لا يوجد حل صحيح

نصائح أخرى

لقد واجهت قضية مماثلة أمس مع إنشاء iRepository (من 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

تأكد من قيامك بإنشاء حاوية واحدة فقط.

قمت أيضًا بتحويل مشروع C# من Castle Windsor إلى StructureMap. قام المشروع الأصلي المستند إلى CW بتأسيس حاوية في Application_Start () (MVC2 Project) وتم تمريره للتكوين. ظللت نفس النهج دون تفكير ، نوعًا ما عندما تترجم من الإسبانية إلى الإنجليزية ، وهو سيء بنفس القدر. قون

ما حدث هو أنه انتهى بي الأمر إلى إنشاء حاوية SM ثانية. حاوية structuremap ثابتة ، وبالتالي هناك دائمًا واحدة "في الخلفية". إذا قمت بتركيب حاوية جديدة ، فأنت في الواقع تنشئ حاوية مستقلة ثانية. إذا لم تكن حريصًا ، فأنت تنتهي في بعض الأحيان باستخدام واحدة ، وأحيانًا أخرى ، وتحصل على طاعون من أخطاء "لا مثيل افتراضي" في نقاط مختلفة عندما تعرف أنه محدد ..

الطريقة التي صادفتها هي أنني انتهى بي الأمر بتوحيد الكود الخاص بي من خلال مكالمات WhatsoHihave () ، والتي كانت محظوظة لأنني لاحظت أنه في بعض الأحيان رأيت حاوية مكونة (الثانية) وأحيانًا رأيت الحاوية الثابتة (الأولى) ، والتي لم يتم تكوينه. كانت أسماء GUID مختلفة الهبة.

تحقق مما إذا كان نفس الشيء يحدث في رمز VB الخاص بك.

ليس هذا على دراية بهذا ، ولكن يبدو أنه قد لا يتم تسجيله في الحاوية أو لأن المحلول الجشع قد يختار مُنشئًا لا يحتوي على عناصر مسجلة. عنوان URL التالي يشبه إلى حد كبير نفس المشكلة ، ألقِ نظرة ...http://learningbyfailing.com/2010/02/structuremap-exception-no-default-instance-defined-for-pluginfamily-ifordsauthentice/

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top