渐渐用惯了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(); } }