自托管(无IIS或WAS)WCF,其中包含需要参数的服务

时间:2012-04-04 19:05:35

标签: wcf dependency-injection ninject default-constructor self-hosting

希望这很简单。我想知道这是否可能 - 也许不是。我正在尝试自托管WCF服务(在我的示例中,它是一个控制台应用程序)。该服务没有默认构造函数。它只包含一个参数签名构造函数。我需要该服务才能处理用户会话。目前我正在使用Ninject DI。这是我提出的一个简单的代码解决方案,用于演示我的问题:

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并覆盖一些为该服务创建实例的方法?

1 个答案:

答案 0 :(得分:1)

使用Ruben的建议(在评论中),我能够在Ninject.Extensions.Wcf源代码库中找到一个工作示例。