2009-08-18 5 views
6

Tôi đang sử dụng CTP tháng 7 của .Net RIA Services trong một ứng dụng ASP.Net với một số thành phần Silverlight. Tôi gọi RIA Services từ Silverlight..Net RIA Services: DomainService cần một trình tạo thông số không?

Sự cố của tôi nảy sinh khi tôi cố gắng sử dụng tính năng Thống nhất và chèn phụ thuộc hàm dựng trong Dịch vụ miền của tôi (đối tượng LinqToEntitiesDomainService). Ứng dụng Silverlight bây giờ phàn nàn về việc không có một hàm tạo parameterless.

Tôi không muốn có một hàm tạo tham số, tôi muốn Unity giải quyết các đối số hàm tạo. Điều này có thể không? Tôi có làm điều gì sai? Hoặc tôi nên tìm một cách khác để tiêm đối số constructor của tôi?

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

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

    ... 

Đây là lỗi tôi nhận được:

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 

Trả lời

12

Vì bạn có một DomainService với một tham số trong ctor của nó, và nói chung cần phải được xây dựng thông qua một số loại IoC container hoặc dependency injection hệ thống, bạn sẽ cần phải cung cấp một nhà máy dịch vụ miền cấp ứng dụng. Nhà máy của bạn sau đó chịu trách nhiệm khởi tạo dịch vụ miền (và xử lý nó), và nó có thể làm như vậy bằng cách gọi vào một API khác, chẳng hạn như Unity trong trường hợp của bạn.

Dưới đây là một ví dụ cơ bản:

Trong Global.asax.cs của ứng dụng của bạn, thêm dòng sau:

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

Hy vọng rằng sẽ giúp!

+0

Tôi đang tìm kiếm. Cảm ơn vì điều đó :) – Davita

0

@Brien, tôi cho rằng 'IUserService' phụ thuộc vào IUnitOfWork, trong đó IUnitOfWork là DashboardEntities?

Như thế này UserRepository:

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

    ... 
} 

Và đây 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; 
    } 

    ... 
} 

Tôi đang sử dụng thiết kế này. Một điều tôi nhận thấy là lớp DashboardEntities được tạo nhiều lần. Lần đầu tiên được tạo bởi Unity (và sẽ chỉ được tạo một lần vì nó được khai báo là Singleton trong Cấu hình Unity).

Nhưng lần sau, có vẻ như một lớp học Bảng điều khiển mới được tạo trong khi khởi tạo từ DomainService (DashboardService)? Đây không phải là vấn đề lớn bởi vì DomainService sẽ không sử dụng ObjectContext này, nó sẽ sử dụng ObjectContext được Unity chèn vào trong kho lưu trữ.

Ai đó có thể xác nhận thiết kế này hoặc hiển thị thêm một chút ánh sáng về vấn đề này không?