2009-08-18 16 views
6

Bazı Silverlight bileşenleriyle bir ASP.Net uygulamasında Temmuz CTP'si .Net RIA Hizmetlerini kullanıyorum. Silverlight'tan RIA Hizmetlerini arıyorum..Net RIA Hizmetleri: DomainService Parametersiz Oluşturucuya mı İhtiyacı Var?

Etki Alanı Hizmetimde (bir LinqToEntitiesDomainService nesnesi) Unity ve yapıcı bağımlılık enjeksiyonunu kullanmaya çalıştığımda sorunum oluştu. Silverlight uygulaması, artık parametresiz bir kurucunun olmamasından şikayet ediyor.

Parametresiz bir kurucuyu istemiyorum, yapıcı argümanlarını çözmek için Unity'yi istiyorum. Mümkün mü? Yanlış bir şey mi yapıyorum? Veya kurucu argümanlarımı enjekte etmenin başka bir yolunu bulmalı mıyım? onun ctor bir parametresi olan bir DomainService var ve daha genel olarak IoC kapsayıcı veya bağımlılık enjeksiyon çeşit yoluyla inşa edilmesi gerekmektedir yana

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 

cevap

12

: Burada

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

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

    ... 

alıyorum hata var sistem, uygulama düzeyinde bir etki alanı hizmeti fabrikası sağlamanız gerekir. Fabrikanız daha sonra alan hizmetini (ve elden çıkarmayı) başlatmaktan sorumludur ve sizin durumunuzdaki Birlik gibi başka bir API'yi arayarak bunu yapabilir.

uygulamanızın Global.asax.cs yılında

şunları ekleyin:: yardımcı

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(); 
    } 
} 

Umut

Burada temel bir örnek!

+0

Onu arıyordum. Bunun için teşekkürler :) – Davita

0

@Brien, IUnitOfWork'un DashboardEntities olduğu IUnitOfWork'a bağlı olarak 'IUserService' değeri var mı?

bu UserRepository gibi

:

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

    ... 
} 

Ve bu 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; 
    } 

    ... 
} 

Bu tasarım kullanıyorum. Farkettiğim bir şey, DashboardEntities sınıfının bir kereden fazla oluşturulduğudur. Unity tarafından ilk kez yaratıldı (ve Unity Yapılandırmasında Tekton olarak bildirildiği için yalnızca bir kez oluşturulacak).

Ancak bir sonraki sefer, DomainService (DashboardService) 'den başlatılırken yeni bir DashboardEntities sınıfı oluşturuldu mu? Bu önemli bir şey değildir çünkü DomainService bu ObjectContext'i kullanmaz, Bu, Depolarda Unity tarafından enjekte edilen ObjectContext'i kullanır.

Birisi bu tasarımı doğrulayabilir mi veya bu konuda biraz daha fazla ışık gösterebilir mi?

İlgili konular