1

Agatha RRSL を使用する WCF サービス ライブラリを開発しましたが、コンテナーを初期化する方法がわかりません。ASP.NET Web アプリケーションでこのサービスを再作成すると、Global.asax.cs Application_Start() から初期化コードを呼び出すことができ、すべてが完全に機能します。初期化コードは次のとおりです。

public static class ComponentRegistration
{
    public static void Register()
    {
      new ServiceLayerConfiguration(Assembly.GetExecutingAssembly(),
      typeof(HelloWorldRequest).Assembly,
      typeof(Agatha.Castle.Container)).Initialize();
    }
}

WCF サービス ライブラリに、次を呼び出すクラスを含む App_Code フォルダーを追加しました。

public static void AppInitialize()
{
    ComponentRegistration.Register();
}

クライアントアプリがそのタイプの応答がないという例外をスローするため、それは機能しませんでした。また、コンポーネントを web.config ファイルに追加しようとしましたが、それが機能することさえありませんでした。

また、初期化を行うカスタム ServiceHost を作成しようとしました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ServiceModel;
using System.ServiceModel.Activation;
using Agatha.ServiceLayer;
using System.Reflection;
using Sample.Common.RequestsAndResponses;

namespace Sample.ServiceLayer.WCFHost
{
    public class CustomServiceHostFactory : ServiceHostFactory
    {
        public CustomServiceHostFactory()
        {
            new ServiceLayerConfiguration(Assembly.GetExecutingAssembly(), typeof(HelloWorldRequest).Assembly,
                typeof(Agatha.Castle.Container)).Initialize();
        }

        protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
        {
            return new CustomServiceHost(serviceType, baseAddresses);
        }
    }

    public class CustomServiceHost : ServiceHost
    {
        public CustomServiceHost()
        {
        }

        public CustomServiceHost(Type serviceType, params Uri[] baseAddresses)
            : base(serviceType, baseAddresses)
        {
        }

        protected override void OnOpening()
        {
            base.OnOpening();
        }

        protected override void OnClosing()
        {
            base.OnClosing();
        }

        protected override void ApplyConfiguration()
        {
            base.ApplyConfiguration();
        }
    }
}

ただし、クライアントで同じ例外が発生します。

System.InvalidOperationException was unhandled
  Message=There is no response with type Sample.Common.RequestsAndResponses.HelloWorldResponse. Maybe you called Clear before or forgot to add appropriate request first.
  Source=Agatha.Common
  StackTrace:
       at Agatha.Common.RequestDispatcher.Get[TResponse]() in c:\src\Agatha\Agatha.Common\RequestDispatcher.cs:line 125
       at Agatha.Common.RequestDispatcher.Get[TResponse](Request request) in c:\src\Agatha\Agatha.Common\RequestDispatcher.cs:line 150
       at ConsoleApplication1.Program.Main(String[] args) in C:\Users\ultraviolet\Documents\Visual Studio 2010\Projects\AgathaHelloWorld\ConsoleApplication1\Program.cs:line 20
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException:

ホストが正しい型を返すように、WCF サービス ライブラリで初期化コードを実行するには、どのような方法をとればよいですか? どんなガイダンスでも大歓迎です。ありがとう。

4

0 に答える 0