代码之家  ›  专栏  ›  技术社区  ›  brien

.NET RIA服务:DomainService需要无参数构造函数?

  •  6
  • brien  · 技术社区  · 15 年前

    我正在使用带有一些Silverlight组件的ASP.NET应用程序中的.NET RIA服务的July CTP。我正在从Silverlight调用RIA服务。

    当我试图在我的域服务(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
    
    2 回复  |  直到 14 年前
        1
  •  12
  •   Nikhil Kothari    15 年前

    由于您有一个在其ctor中带有参数的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();
        }
    }
    

    希望有帮助!

        2
  •  0
  •   Stef Heyenrath Dariusz Woźniak    14 年前

    @Brien,我假设“iuserService”取决于iunitofwork,iunitofwork在哪里是仪表板实体?

    这样地 用户库 :

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

    而这 电子工业 :

    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;
        }
    
        ...
    }
    

    我用的是这个设计。 我注意到的一件事是 仪表板实体 类被创建多次。 第一次由Unity创建(并且只创建一次,因为它在Unity配置中声明为单例)。

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

    有人能证实这一设计吗?或者能在这个问题上多做些说明吗?

    推荐文章