6

我在带有一些 Silverlight 组件的 ASP.Net 应用程序中使用 .Net RIA 服务的 7 月 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
4

2 回答 2

12

由于您有一个在其 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();
    }
}

希望有帮助!

于 2009-08-25T18:30:18.490 回答
0

@Brien,我假设“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 配置中被声明为单例)。

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

有人可以确认这个设计或对这个问题有更多的了解吗?

于 2010-08-12T16:39:18.353 回答