2012-08-14 24 views
2

配置WCF和StructureMap ServiceHostFactory我正在創建一個自定義的ServiceHost對象並從代碼進行配置。我的服務使用InstanceContextMode.Single和ConcurrencyMode.Multiple並託管在Windows服務中。從代碼

如許多博客/文章(here)所述,跨實例共享StructureMap容器​​需要使用自定義InstanceProvider,ServiceBehavior和ServiceHostFactory。

我的初始化代碼如下所示。我不使用配置文件。

var baseAddress = ConfigurationManager.AppSettings["BaseAddress"]; 
var port = Int32.Parse(ConfigurationManager.AppSettings["Port"]); 

Host = new MyServiceHost(typeof(MediaFileServicePrivate), new Uri(string.Format(baseAddress, port))); 

var binding = new NetTcpBinding(); 
Host.AddServiceEndpoint(typeof(IMediaFileServicePrivate), binding, string.Format(baseAddress, port)); 

如何讓服務使用我的自定義服務主機工廠?我可以從配置文件中找到所有的例子。

是否僅用於IIS/WAS託管方案的ServiceHostFactory?如果是這樣,我如何將SM用於自託管的InstanceContextMode.Single服務?

回答

0

這沒有得到回答?本質上,你告訴它使用您的服務工廠在WCF標記

<%@ ServiceHost Language="C#" Debug="true" Service="WcfWithDI.Service1" CodeBehind="Service1.svc.cs" Factory="WcfWithDI.MyServiceFactory"%>

我這裏有一個樣本項目所有的有線了一個自定義的供應商(和structuremap) https://github.com/billCreativeD/WCF_With_DI

+0

在我的情況下,沒有代碼隱藏。它是100%C#,如我的問題所示。 – rboarman 2012-12-22 00:24:10

0

不幸的意義不大說「服務使用工廠」。你可以使用Ninject工廠創建您的服務:

var factory = new NinjectServiceHostFactory(); 

var address = new Uri(_baseAddress, path); 
ServiceHostBase host = factory.CreateServiceHost(typeName, new[] {address}); 

var binding = new NetTcpBinding(); 
host.AddServiceEndpoint(typeof(TheType), binding, string.Format(baseAddress, port)); 

在.svc文件的指令是用來告訴.NET如何實例爲您服務。

+0

問題是關於如何從代碼配置StructureMap而不是配置文件。 – rboarman 2013-02-12 20:05:40

+0

是的。「如何告訴服務使用我的定製服務主機工廠?」 - 假設「服務主機工廠」是指WCF服務主機工廠,那麼問題就是有缺陷的。該服務不使用工廠。工廠創建服務。 – Cornelius 2013-02-13 12:24:01

+0

雖然你是對的,但ninject沒有關係。 (我認爲在寫作時有點粗心,我的問題和你的問題一樣,只是使用ninject而不是StructureMap。) – Cornelius 2013-02-13 12:25:59