因为最初错误的理解了Contract与Service的关系,把每个业务定义了相应的Contract与Service并将对应的Service一一继承相应的Contract,因为在WCF每个host只能提供一个Service所以导致,当你的服务很多的时候你要定义N多个host

看下面演示提供User(用户)和Order(订单)两个服务:

开启多个host代码:



ServiceHost host1 = new ServiceHost(typeof(UserService)); 

host1.Open();

ServiceHost host2 = new ServiceHost(typeof(OrderService)); 

host2.Open();


 

 

开启多个host配置

代码 


WCF一个Host实现多契约服务_应用程序域WCF一个Host实现多契约服务_客户端_02代码


<system.serviceModel>

    <services>

      <service name="Wcf.Services.UserService">

        <endpoint address="net.tcp://localhost:8001/UserService" binding="netTcpBinding"  contract="Wcf.Contract.IUserService" >

        </endpoint>

      </service>

      <service name="Wcf.Services.OrderService">

        <endpoint address="net.tcp://localhost:8001/OrderService"  binding="netTcpBinding" contract="Wcf.Contract.IOrderService" >

        </endpoint>

      </service>

    </services>

</system.serviceModel>


 

后来发现Service是可以和业务类型没关系的,它仅用来表示当前host能提供的服务,不要理解Service要根据不同的业务类型来切分,Contract才是和业务类型有关系的原则上要按照业务类型来切分。然后其实WCF并不推荐在应用程序域中创建多个ServiceHost实例。如果要托管多个服务,完全可以在一个host中通过多个Endpoint公开多个WCF服务的办法来实现,而每个Endpoint都可以对应相应的Contract。

 

User契约代码:

 



namespace Wcf.Contract

{

    [ServiceContract]

    public interface IUserService

    {

        [OperationContract]

        void Edit();

    }

}



 

 Order契约代码:



namespace Wcf.Contract

{

    [ServiceContract]

    public interface IOrderService

    {

        [OperationContract]

        void Add();

    }

}


 

 

Service代码:让所有功能在一个Service上实现

代码 


WCF一个Host实现多契约服务_应用程序域WCF一个Host实现多契约服务_客户端_02代码


namespace Wcf.Services

{

    public class MallService : IUserService, IOrderService

    {


    

        public void Add()

        {

            throw new NotImplementedException();

        }



        void Edit()

        {

            throw new NotImplementedException();

        }



    }

}



 

 

当然这里可以使用 partial 关键字 把代码放在不同的文件上,来达到物理上的切分比如:

文件UserService.cs

 public partial  class MallService : IUserService

文件 OrderService.cs

 public partial  class MallService : IOrderService

 

host代码

代码 


WCF一个Host实现多契约服务_应用程序域WCF一个Host实现多契约服务_客户端_02代码


namespace Wcf.Host

{

    class Program

    {

        static void Main(string[] args)

        {

            using (ServiceHost host = new ServiceHost(typeof(Wcf.Services.MallService)))

            {

                host.Open();

                Console.Read();

            }

        }

    }

}


 

 

配置文件:在一个service上定义多个endpoint使用不同的契约接口

代码 


WCF一个Host实现多契约服务_应用程序域WCF一个Host实现多契约服务_客户端_02代码


<system.serviceModel>

    <services>

      <service name="Wcf.Services.MallService" behaviorConfiguration="MallServiceBehaviors" >      

        <endpoint  address="" contract="Wcf.Contract.IUserService" binding="basicHttpBinding"></endpoint>

        <endpoint  address="" contract="Wcf.Contract.IOrderService" binding="basicHttpBinding"></endpoint>

        <host>

          <baseAddresses>

            <add baseAddress="http://localhost:8899/MallService%22/>

          </baseAddresses>

        </host>

      </service>

      

    </services>

    <behaviors>

      <serviceBehaviors>

        <behavior name="MallServiceBehaviors" >

          <serviceMetadata httpGetEnabled="true" />

        </behavior>

      </serviceBehaviors>

    </behaviors>


  </system.serviceModel>



 

 

客户端代码:客户端可以根据不同endpoint的契约实现不同的类

代码 


WCF一个Host实现多契约服务_应用程序域WCF一个Host实现多契约服务_客户端_02代码


namespace Wcf.Test

{

    class Program

    {

        static void Main(string[] args)

        {

            UserServiceClient user = new UserServiceClient();

            user.Edit();


            OrderServiceClient order = new OrderServiceClient();

            order.Add();

        }

    }

}



 

 

以后如果要对WCF应用程序扩展只需定义契约 然后partial  class MallService : 契约接口 实现代码, 并在host的在配置文件中加入 相应的 endpoint 即可