2009-08-18 14 views
6

मैं कुछ सिल्वरलाइट घटकों के साथ एएसपी.Net एप्लिकेशन में .NET RIA सेवाओं के जुलाई सीटीपी का उपयोग कर रहा हूं। मैं सिल्वरलाइट से आरआईए सेवाओं को बुला रहा हूं।नेट आरआईए सेवाएं: डोमेन सेवा को पैरामीटर रहित कन्स्ट्रक्टर की आवश्यकता है?

मेरी समस्या तब उत्पन्न हुई जब मैंने अपनी डोमेन सेवा (एक LinqToEntitiesDomainService ऑब्जेक्ट) में एकता और कन्स्ट्रक्टर निर्भरता इंजेक्शन का उपयोग करने का प्रयास किया। सिल्वरलाइट एप्लिकेशन अब पैरामीटर रहित कन्स्ट्रक्टर नहीं होने के बारे में शिकायत करता है।

मैं पैरामीटर रहित कन्स्ट्रक्टर नहीं चाहता, मैं चाहता हूं कि एकता कन्स्ट्रक्टर तर्कों को हल करे। क्या यह संभव है? क्या मुझसे कुछ गलत हो रही है? या मुझे अपने कन्स्ट्रक्टर तर्कों को इंजेक्ट करने का एक और तरीका खोजना चाहिए?

public class DashboardService : LinqToEntitiesDomainService<DashboardEntities> 
{ 
    private IUserService userService; 

    public DashboardService(IUserService userService) 
     : base() 
    { 
     if (userService == null) 
     { 
      throw ExceptionBuilder.ArgumentNull("userService"); 
     } 
     this.userService = userService; 
    } 

    ... 

यहाँ त्रुटि मैं हो रही है:

Webpage error details 

User Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) 
Timestamp: Tue, 18 Aug 2009 14:34:54 UTC 


Message: Unhandled Error in Silverlight 2 Application No parameterless constructor defined for this object. at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck) 
    at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache) 
    at System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache) 
    at System.Activator.CreateInstance(Type type, Boolean nonPublic) 
    at System.Web.DomainServices.DomainService.DefaultDomainServiceFactory.CreateDomainService(Type domainServiceType, DomainServiceContext context) 
    at System.Web.Ria.DataServiceFactory.GetDataService(HttpContext context) 
    at System.Web.Ria.DataServiceFactory.System.Web.IHttpHandlerFactory.GetHandler(HttpContext context, String requestType, String url, String pathTranslated) 
Line: 1 
Char: 1 
Code: 0 
URI: http://dev.localhost/Home 

उत्तर

12

जब से तुम अपनी ctor में एक पैरामीटर के साथ एक DomainService है, और अधिक आम तौर पर आईओसी कंटेनर या निर्भरता इंजेक्शन के कुछ प्रकार के माध्यम से निर्माण करने की आवश्यकता है सिस्टम, आपको एक ऐप-स्तरीय डोमेन सेवा फैक्ट्री प्रदान करने की आवश्यकता होगी। आपका कारखाना तब डोमेन सेवा (और इसे निपटाने) को तत्काल करने के लिए ज़िम्मेदार है, और यह आपके मामले में एकता जैसे किसी अन्य एपीआई में कॉल करके ऐसा कर सकता है।

अपने अनुप्रयोग के Global.asax.cs में, निम्नलिखित जोड़ें::

public class Global : HttpApplication { 

    static Global() { 
     DomainService.Factory = new MyAppDomainServiceFactory(); 
    } 
} 

internal sealed class MyAppDomainServiceFactory : IDomainServiceFactory { 

    public DomainService CreateDomainService(Type domainServiceType, 
              DomainServiceContext context) { 
     DomainService ds = ... // code to create a service, or look it up 
           // from a container 

     if (ds != null) { 
      ds.Initialize(context); 
     } 
     return ds; 
    } 

    public void ReleaseDomainService(DomainService domainService) { 
     // any custom logic that must be run to dispose a domain service 
     domainService.Dispose(); 
    } 
} 

आशा है कि मदद करता है

यहाँ एक बुनियादी उदाहरण है!

+0

मैं इसे ढूंढ रहा था। उसके लिए धन्यवाद :) – Davita

0

@ ब्रायन, मुझे लगता है कि 'IUserService' IUnitOfWork पर निर्भर करता है, जहां IUnitOfWork डैशबोर्ड एंटीटीज़ है?

इस UserRepository तरह:

public class UserRepository : BaseRepository<User>, IUserRepository 
{ 
    protected BaseRepository(IUnitOfWork unitOfWork) 
    { 
    } 

    ... 
} 

और यह IUnitOfWork:

public partial class DashboardEntities : ObjectContext, IUnitOfWork 
{ 
    public const string ConnectionString = "name=DashboardEntities"; 
    public const string ContainerName = "DashboardEntities"; 

    public DashboardEntities() 
     : base(ConnectionString, ContainerName) 
    { 
     this.ContextOptions.LazyLoadingEnabled = true; 
    } 

    ... 
} 

मैं इस डिजाइन का उपयोग कर रहा हूँ। एक बात मैंने देखी है कि डैशबोर्ड एंटीटी कक्षा एक से अधिक बार बनाई गई है। पहली बार यह एकता द्वारा बनाई गई है (और केवल एक बार बनाई जाएगी क्योंकि इसे एकता कॉन्फ़िगरेशन में सिंगलटन के रूप में घोषित किया गया है)।

लेकिन अगली बार, ऐसा लगता है कि एक नया डैशबोर्ड एंटीटी कक्षा डोमेन सेवा (डैशबोर्ड सेवा) से प्रारंभ के दौरान बनाई गई है? यह कोई बड़ा सौदा नहीं है क्योंकि DomainService इस ऑब्जेक्ट कॉन्टेक्स्ट का उपयोग नहीं करेगा, यह ऑब्जेक्ट कॉन्टेक्स्ट का उपयोग करेगा जिसे रेपॉजिटरीज़ में एकता द्वारा इंजेक्शन दिया जाता है।

क्या कोई इस डिजाइन की पुष्टि कर सकता है या इस मुद्दे पर कुछ और प्रकाश दिखा सकता है?

संबंधित मुद्दे