渐渐用惯了Structure,却发现不能直接支持Wcf。
就着手查查资料:http://lostechies.com/jimmybogard/2008/07/30/integrating-structuremap-with-wcf/
上面的大神不喜欢XML,直接无视XML方式,我倒。
看来能自己动手:
创建 StructureMapServiceBehavior
public class StructureMapServiceBehavior : IServiceBehavior { public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { foreach (ChannelDispatcherBase cdb in serviceHostBase.ChannelDispatchers) { ChannelDispatcher cd = cdb as ChannelDispatcher; if (cd != null) { foreach (EndpointDispatcher ed in cd.Endpoints) { ed.DispatchRuntime.InstanceProvider = new StructureMapInstanceProvider(serviceDescription.ServiceType); } } } } public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection endpoints, BindingParameterCollection bindingParameters) { } public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { } }
创建 StructureMapInstanceProvider
public class StructureMapInstanceProvider : IInstanceProvider { private readonly Type _serviceType; public StructureMapInstanceProvider(Type serviceType) { _serviceType = serviceType; } public object GetInstance(InstanceContext instanceContext) { return GetInstance(instanceContext, null); } public object GetInstance(InstanceContext instanceContext, Message message) { var obj = ObjectFactory.GetInstance(_serviceType); //Console.WriteLine(obj.GetHashCode()); return obj; } public void ReleaseInstance(InstanceContext instanceContext, object instance) { } }
创建 StructureMapBehaviorExtension
public class StructureMapBehaviorExtension : BehaviorExtensionElement { public override Type BehaviorType { get { return typeof(StructureMapServiceBehavior); } } protected override object CreateBehavior() { return new StructureMapServiceBehavior(); } }
然后设置app.config
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
<? xml version = "1.0" encoding = "utf-8" ?> < configuration > < system.web > < compilation debug = "true" /> </ system.web > <!-- 部署服务库项目时,必须将配置文件的内容添加到 主机的 app.config 文件中。System.Configuration 不支持库的配置文件。--> < system.serviceModel > < services > < service name = "WcfStructureMap3.Service1" > < host > < baseAddresses > </ baseAddresses > </ host > <!-- Service Endpoints --> <!-- 除非完全限定,否则地址将与上面提供的基址相关 --> < endpoint address = "" binding = "basicHttpBinding" contract = "WcfStructureMap3.IService1" > <!-- 部署时,应删除或替换下列标识元素,以反映 用来运行所部署服务的标识。删除之后,WCF 将 自动推断相应标识。 --> < identity > < dns value = "localhost" /> </ identity > </ endpoint > <!-- Metadata Endpoints --> <!-- 元数据交换终结点供相应的服务用于向客户端做自我介绍。 --> <!-- 此终结点不使用安全绑定,应在部署前确保其安全或将其删除--> < endpoint address = "mex" binding = "mexHttpBinding" contract = "IMetadataExchange" /> </ service > </ services > < behaviors > < serviceBehaviors > < behavior > <!-- 为避免泄漏元数据信息, 请在部署前将以下值设置为 false --> < serviceMetadata httpGetEnabled = "True" httpsGetEnabled = "True" /> <!-- 要接收故障异常详细信息以进行调试, 请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息--> < serviceDebug includeExceptionDetailInFaults = "False" /> < StructureMapExt /> </ behavior > </ serviceBehaviors > </ behaviors > < extensions > < behaviorExtensions > < add name = "StructureMapExt" type = "WcfStructureMap3.StructureMapBehaviorExtension, WcfStructureMap3" /> </ behaviorExtensions > </ extensions > </ system.serviceModel > </ configuration > |
简单写一个宿主程序
class Program { static void Main(string[] args) { ObjectFactory.Initialize( inti => { inti.For()Use(); } ); ServiceHost host = new ServiceHost(typeof(WcfStructureMap3.Service1)); host.Open(); Console.WriteLine("服务启动"); Console.ReadLine(); } }