3

うまくいけば、これは簡単なものです。これが可能かどうか疑問に思います-おそらくそうではありません。WCFサービスをセルフホストしようとしています(以下の例では、コンソールアプリケーションです)。このサービスにはデフォルトのコンストラクターがありません。これには、単一のパラメーター署名コンストラクターのみが含まれています。ユーザーセッションを処理できるようにするためのサービスが必要です。現在、NinjectDIを使用しています。これが私の問題を実証するために私が思いついた簡単なコードソリューションです:

using System;
using System.ServiceModel;
using System.ServiceModel.Web;
using Ninject.Modules;

namespace ConsoleApplication1
{
    public class Program
    {
        static void Main()
        {
            using (var webServiceHost = new WebServiceHost(typeof(MyWcf)))
            {
                var webHttpBinding = new WebHttpBinding();
                var uri = new Uri("http://localhost:8000/");
                webServiceHost.AddServiceEndpoint(typeof(IMyWcf), webHttpBinding, uri);
                webServiceHost.Open();
                Console.WriteLine("Service is ready...");
                Console.ReadKey();
            }
        }
    }

    [ServiceContract]
    public interface IMyWcf
    {
        [OperationContract, WebGet(UriTemplate = "")]
        string HelloWorld();
    }

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    public class MyWcf : IMyWcf
    {
        private readonly IMessage _customMessage = new Message("Default Message.");

        public MyWcf(IMessage message)
        {
            _customMessage = message;
        }

        public string HelloWorld()
        {
            return _customMessage.Text;
        }
    }

    public interface IMessage
    {
        string Text { get; }
    }

    public class Message : IMessage
    {
        public Message (string message)
        {
            Text = message;
        }
        public string Text { get; set; }
    }

    public class NinjectSetup : NinjectModule
    {
        public override void Load()
        {
            Bind<IMessage>().To<Message>()
                .WithConstructorArgument("message", "Injected String Message.");
        }
    }
}

明らかに、パラメーター化されたコンストラクターをコメントアウトすると、サービスを実行できます。しかし、それは私には良くありません。ServiceHostFactoryを使用したくないのは、明らかに.svc/IISが必要だからです。これを回避する方法はありますか?MyWebServiceHostサービスのインスタンスを作成するメソッドを継承しWebServiceHostてオーバーライドする新しいものを作成できますか?

4

1 に答える 1

1

上記の Ruben の提案 (コメント内) を使用して、Ninject.Extensions.Wcf ソース リポジトリ内で動作する例を見つけることができました。

于 2012-04-05T14:08:25.490 に答える