关于WCF的接口和实现分离问题

时间:2022-02-09 13:24:40
WCF中标准例子中,接口及其实现在同一个项目中,小虾米想问问是否可以分开,我试验了一下,总是报错!

9 个解决方案

#1


实际意思是我只想暴露接口,是否可以实现?

#2


可以分开,我就是分开的,错误得看你是怎么写的,一般正确引用是不可能报错的。

#3


举个例子,下面的代码中typeof中需要的是class,如果我只暴露接口,那服务如何启动?
前提是不引用实现接口的项目。

ServiceHost _host = new ServiceHost(typeof(ClassLibrary1.test));

#4


附上 config文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <system.web>
    <compilation debug="true" />
  </system.web>
  <!-- 部署服务库项目时,必须将配置文件的内容添加到 
  主机的 app.config 文件中。System.Configuration 不支持库的配置文件。-->
  <system.serviceModel>
    <services>
      <service name="ClassLibrary1.test">
        <host>
          <baseAddresses>
            <add baseAddress = "http://localhost:8732/" />
          </baseAddresses>
        </host>
        <!-- Service Endpoints -->
        <!-- 除非完全限定,否则地址将与上面提供的基址相关 -->
        <endpoint address ="" binding="wsHttpBinding" contract="WcfServiceLibrary1.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"/>
          <!-- 要接收故障异常详细信息以进行调试,
          请将以下值设置为 true。在部署前设置为 false 
            以避免泄漏异常信息-->
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

</configuration>

#5


引用 3 楼  的回复:
举个例子,下面的代码中typeof中需要的是class,如果我只暴露接口,那服务如何启动?
前提是不引用实现接口的项目。

C# code

ServiceHost _host = new ServiceHost(typeof(ClassLibrary1.test));

不引用实现接口的项目?那你实现接口的项目放着干嘛用?ServiceHost不去引用它的话,就没地方会用到了,难道让客户端去引用?

#6


当你把接口和实现接口的项目分开时,你就可以单独将接口暴露给客户端引用(dll方式引用),这才是分离接口的真正目的,而不是不让服务端看到,服务端启动服务看不到它的实现的话,如何启动?

#7


服务器 肯定是可以访问所有的类的,不能访问的话就相当于没用到,
客户端 接收服务器传来的对象,然后根据接口转化为实际对象来使用的 
我也正在学习wcf 呵呵

#8


基本明白了,跟踪那个Service1Client对象,它继承自IService1接口,那就是公开的方法其实是接口中暴露的方法,而非实现类暴露的方法,是这样的吧。

#9



ServiceHost _host = new ServiceHost(typeof(ClassLibrary1.test))
搬到WCF类库

#1


实际意思是我只想暴露接口,是否可以实现?

#2


可以分开,我就是分开的,错误得看你是怎么写的,一般正确引用是不可能报错的。

#3


举个例子,下面的代码中typeof中需要的是class,如果我只暴露接口,那服务如何启动?
前提是不引用实现接口的项目。

ServiceHost _host = new ServiceHost(typeof(ClassLibrary1.test));

#4


附上 config文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <system.web>
    <compilation debug="true" />
  </system.web>
  <!-- 部署服务库项目时,必须将配置文件的内容添加到 
  主机的 app.config 文件中。System.Configuration 不支持库的配置文件。-->
  <system.serviceModel>
    <services>
      <service name="ClassLibrary1.test">
        <host>
          <baseAddresses>
            <add baseAddress = "http://localhost:8732/" />
          </baseAddresses>
        </host>
        <!-- Service Endpoints -->
        <!-- 除非完全限定,否则地址将与上面提供的基址相关 -->
        <endpoint address ="" binding="wsHttpBinding" contract="WcfServiceLibrary1.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"/>
          <!-- 要接收故障异常详细信息以进行调试,
          请将以下值设置为 true。在部署前设置为 false 
            以避免泄漏异常信息-->
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

</configuration>

#5


引用 3 楼  的回复:
举个例子,下面的代码中typeof中需要的是class,如果我只暴露接口,那服务如何启动?
前提是不引用实现接口的项目。

C# code

ServiceHost _host = new ServiceHost(typeof(ClassLibrary1.test));

不引用实现接口的项目?那你实现接口的项目放着干嘛用?ServiceHost不去引用它的话,就没地方会用到了,难道让客户端去引用?

#6


当你把接口和实现接口的项目分开时,你就可以单独将接口暴露给客户端引用(dll方式引用),这才是分离接口的真正目的,而不是不让服务端看到,服务端启动服务看不到它的实现的话,如何启动?

#7


服务器 肯定是可以访问所有的类的,不能访问的话就相当于没用到,
客户端 接收服务器传来的对象,然后根据接口转化为实际对象来使用的 
我也正在学习wcf 呵呵

#8


基本明白了,跟踪那个Service1Client对象,它继承自IService1接口,那就是公开的方法其实是接口中暴露的方法,而非实现类暴露的方法,是这样的吧。

#9



ServiceHost _host = new ServiceHost(typeof(ClassLibrary1.test))
搬到WCF类库