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

浙公网安备 33010602011771号