2009-08-18 96 views
6

我在一些Silverlight組件的ASP.Net應用程序中使用.Net RIA Services的七月CTP。我從Silverlight調用RIA服務。.Net RIA服務:DomainService需要一個無參數構造函數?

當我嘗試在我的域服務(LinqToEntitiesDomainService對象)中使用Unity和構造函數依賴項注入時,出現了我的問題。 Silverlight應用程序現在抱怨沒有無參數的構造函數。

我不想有無參數的構造函數,我想要Unity來解析構造函數參數。這可能嗎?難道我做錯了什麼?或者我應該找到另一種方法來注入我的構造函數參數?

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

既然你有一個的DomainService在其構造函數的參數,一般多需要通過某種IoC容器或依賴注入的構造系統,您需要提供應用程序級別的服務工廠。然後,您的工廠負責實例化域服務(並對其進行處置),並且可以通過調用另一個API(如您的案例中的Unity)來執行此操作。

這裏有一個基本的例子:

在您的應用程序的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 2011-04-21 11:44:00

0

@布萊恩,我認爲'IUserService'取決於IUnitOfWork,其中IUnitOfWork是DashboardEntities?

像這樣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; 
    } 

    ... 
} 

我使用這種設計。 我注意到的一件事是DashboardEntities類是多次創建的。 第一次由Unity創建(並且由於它在Unity配置中聲明爲Singleton,因此只會創建一次)。

但是下一次,似乎有一個新的DashboardEntities類是在從DomainService(DashboardService)初始化期間創建的? 這沒什麼大不了的,因爲DomainService不會使用這個ObjectContext,它會使用由Unity在Repositories中注入的ObjectContext。

有人可以確認這個設計或在這個問題上顯示更多的光?

相關問題