6

Silverlight コンポーネントを含む ASP.Net アプリケーションで .Net RIA Services の 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
4

2 に答える 2

12

ctor にパラメーターを含む DomainService があり、より一般的には、ある種の IoC コンテナーまたは依存関係注入システムを介して構築する必要があるため、アプリレベルのドメイン サービス ファクトリを提供する必要があります。その後、ファクトリはドメイン サービスのインスタンス化 (および破棄) を担当し、Unity などの別の API を呼び出すことでこれを行うことができます。

基本的な例を次に示します。

アプリの 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;
    }

    ...
}

私はこのデザインを使用しています。私が気づいたことの1つは、DashboardEntitiesクラスが複数回作成されていることです。Unityによって初めて作成されたとき(Unity構成でシングルトンとして宣言されているため、一度だけ作成されます)。

しかし、次回は、DomainService(DashboardService)からの初期化中に新しいDashboardEntitiesクラスが作成されたようです。DomainServiceはこのObjectContextを使用せず、Unityによってリポジトリに挿入されたObjectContextを使用するため、これは大したことではありません。

誰かがこのデザインを確認したり、この問題についてもう少し光を当てたりできますか?

于 2010-08-12T16:39:18.353 に答える