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 >
             < add  baseAddress = "http://localhost:8733/Design_Time_Addresses/WcfStructureMap3/Service1/" />
           </ 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();

        }

    }

 

你可能感兴趣的:(struct)