3
希望這是一件容易的事。我想知道這是否可能 - 可能不是。我試圖自主託管一個WCF服務(在我的例子中,它是一個控制檯應用程序)。該服務沒有默認的構造函數。它只包含一個參數簽名構造函數。我需要該服務來處理用戶會話。目前我正在使用Ninject DI。這裏是我想出了證明我的問題一個簡單的代碼解決方案:自主主機(無IIS或WAS)帶有需要參數的服務的WCF
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
並覆蓋一些將爲服務創建實例的方法嗎?
你看過Ninject.Extensions.wcf中的例子嗎?很確定自己的主機例子是這樣做的。 – 2012-04-04 19:35:47
你有沒有注意到你可以鏈接?我發現的每個例子都有它在IIS中使用ServiceHostFactory或ServiceBehavior ... – ymerej 2012-04-04 19:39:57
Prety確定在示例目錄中有兩個。一個被稱爲self host或sometthing(所有obv在Ninject.Extensions.Wcf存儲庫中的github上) – 2012-04-04 19:41:22