.Net RIA服务:DomainService需要一个无参数的构造函数?

我在带有一些Silverlight组件的ASP.Net应用程序中使用.Net RIA Services的July CTP。 我从Silverlight打电话给RIA服务。

当我尝试在我的域服务(LinqToEntitiesDomainService对象)中使用Unity和构造函数dependency injection时出现了我的问题。 Silverlight应用程序现在抱怨没有无参数构造函数。

我不想拥有无参数构造函数,我希望Unity能够解析构造函数参数。 这可能吗? 难道我做错了什么? 或者我应该找到另一种方法来注入我的构造函数参数?

public class DashboardService : LinqToEntitiesDomainService { 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 

由于您的ctor中有一个带有参数的DomainService,并且通常需要通过某种IoC容器或dependency injection系统构建,因此您需要提供应用级域服务工厂。 然后,您的工厂负责实例化域服务(并处理它),并且可以通过调用另一个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(); } } 

希望有所帮助!

@Brien,我假设’IUserService’依赖于IUnitOfWork,其中IUnitOfWork是DashboardEntities?

像这个UserRepository

 public class UserRepository : BaseRepository, 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)。

但是下一次,似乎在从DomainService(DashboardService)初始化期间创建了一个新的DashboardEntities类? 这没什么大不了的,因为DomainService不会使用这个ObjectContext,它将使用Unity在存储库中注入的ObjectContext。

有人可以确认这个设计或在这个问题上显示更多的亮点吗?