8

के वीबी.Net रूपांतरण में संरचना कार्यान्वयन में समस्या I VB.Net वातावरण में काम करती है और हाल ही में काम करने के आधार के रूप में उपयोग करने के लिए एक एमवीसी वातावरण बनाने के साथ काम किया गया है। मैंने नवीनतम शार्प आर्किटेक्चर रिलीज (क्यू 3 200 9) को वीबी में बदलने का फैसला किया, जो पूरे बाल खींचने के बाद ठीक हो गया है। मुझे कैसल विंडसर के साथ एक समस्या आई, जहां मेरा कस्टम रिपोजिटरी इंटरफ़ेस (कोर/डोमेन प्रोजेक्ट में रहता है) जो कि मेरे परीक्षण नियंत्रक के निर्माता में संदर्भ था, ठोस कार्यान्वयन (डेटा प्रोजेक्ट से) से इंजेक्शन नहीं दे रहा था। मैंने इसके साथ एक ईंट की दीवार मारा ताकि मूल रूप से स्ट्रक्चर मैप के लिए कैसल विंडसर को बाहर निकालने का फैसला किया जा सके।SharpArchitecture

मुझे लगता है कि मैंने इसे ठीक से कार्यान्वित किया है क्योंकि सब कुछ संकलित और चलाता है और कस्टम नियंत्रक इंटरफ़ेस का संदर्भ देते समय मेरा नियंत्रक ठीक चला गया। अब यह प्रतीत होता है कि मेरे पास मेरे जेनेरिक इंटरफेस को ठीक से स्थापित नहीं किया गया है (मुझे उम्मीद है कि यह अब तक समझ में आता है क्योंकि मैं इन सबके लिए नया हूं)। जब मैं नियंत्रक कन्स्ट्रक्टर में रिपोजिटरी (प्रकार का) के ठोस कार्यान्वयन के साथ इंजेक्शन देना चाहता हूं (मुझे निम्नलिखित रनटाइम त्रुटि मिल रही है:

"संरचना मैप अपवाद कोड: 202 कोई डिफ़ॉल्ट नहीं प्लगइनफैमिली SharpArch.Core.PersistenceSupport.irepository`1 [[DebtRemedy.Core.Page, DebtRemedy.Core, Version = 1.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = null]], SharpArch.Core, Version = 1.0.0.0 के लिए परिभाषित उदाहरण , संस्कृति = तटस्थ, PublicKeyToken = b5f559ae0ac4e006 "

यहां मेरे कोड अंश हैं जिनका उपयोग मैं कर रहा हूं (मेरी परियोजना को डेटरमेडी कहा जाता है)।

मेरे 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 (जो मुझे लगता है कि अब पदावनत किया जाता है) की कोशिश की है और के लिए। आईआरपोजिटरी (टी का) SharpArch.Core.Persistence समर्थन में रहता है। रिपोजिटरी (टी का) 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 में

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 (टी का) है के साथ क्या करना।

इसके साथ किसी भी मदद की सराहना की जाएगी।

+1

दुर्भाग्यवश मैं आपकी समस्या से आपकी सहायता नहीं कर सकता लेकिन यह देखना अच्छा लगता है कि वहां अच्छे लोग हैं जो अच्छे वीबी कोड लिखना चाहते हैं । यहां स्टैक ओवरफ्लो पर वीबी के अधिकांश प्रश्न मुझे निराशाजनक बनाते थे। –

+0

IMHO आप इस प्रश्न को वास्तव में सरल बना सकते हैं - बस कोड की रेखाएं दिखाएं जहां आप असफल होने वाले प्रकारों को पंजीकृत करने का प्रयास कर रहे हैं, और कंटेनर या ऑब्जेक्ट फैक्ट्री के माध्यम से उस प्रकार का उदाहरण प्राप्त करने के लिए कोड की कुछ पंक्तियां सेट अप करें । अगर पंजीकरण काम नहीं कर रहा है, तो इसे उसी तरह विफल होना चाहिए। –

उत्तर

1

कल आईआरपीसीटी (तत्काल) के तत्काल के साथ मेरा एक ही मुद्दा था।

मुझे अपने स्कैन प्रतिनिधि में 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

सुनिश्चित करें कि आप केवल एक कंटेनर बना रहे हैं सुनिश्चित करें।

मैंने कैसल विंडसर से स्ट्रक्चर मैप में सी # परियोजना भी परिवर्तित की। मूल सीडब्ल्यू-आधारित प्रोजेक्ट ने एप्लीकेशन_स्टार्ट() (एमवीसी 2 प्रोजेक्ट) में कंटेनर को तुरंत चालू किया और कॉन्फ़िगरेशन के लिए इसे पास कर दिया। मैंने बिना सोच के एक ही दृष्टिकोण रखा, थोड़े समय जब आप स्पैनिश से अंग्रेजी में अनुवाद करते हैं, और यह उतना ही बुरा है। :)

क्या हुआ यह है कि मैंने दूसरा एसएम कंटेनर बनाया। स्ट्रक्चर मैप का कंटेनर स्थिर है, और इसलिए हमेशा पृष्ठभूमि में "एक" होता है। यदि आप एक कंटेनर को नया बनाते हैं, तो आप वास्तव में एक दूसरा, स्वतंत्र कंटेनर बनाते हैं। यदि आप सावधान नहीं हैं, तो आप कभी-कभी एक का उपयोग करते हैं, कभी-कभी दूसरे को, और विभिन्न बिंदुओं पर "नो डिफॉल्ट इंस्टेंस" त्रुटियों का एक प्लेग प्राप्त करते हैं, जब आप जानते हैं कि यह परिभाषित है ..

जिस तरह से मैं आया था कि मैंने व्हाटडीआईहेव() कॉल के साथ अपना कोड कूड़ा कर दिया, जो कि भाग्यशाली था क्योंकि मैंने देखा कि कभी-कभी मैंने एक कॉन्फ़िगर किया गया कंटेनर (दूसरा) देखा और कभी-कभी मैंने स्थैतिक एक (पहला) देखा, जिसे कॉन्फ़िगर नहीं किया गया था। अलग-अलग GUID नाम देने का था।

जांचें कि क्या आपके वीबी कोड में यह हो रहा है।

0

इससे परिचित नहीं है, लेकिन ऐसा लगता है कि यह कंटेनर के साथ पंजीकृत नहीं हो सकता है या क्योंकि रिज़ॉलर लालची है, यह एक ऐसे निर्माता का चयन कर सकता है जिसमें पंजीकृत आइटम नहीं हैं। निम्न यूआरएल एक ही समस्या के समान दिखता है ... http://learningbyfailing.com/2010/02/structuremap-exception-no-default-instance-defined-for-pluginfamily-iformsauthentication/