首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WCF调用不接口方法?

WCF调用不接口方法?
EN

Stack Overflow用户
提问于 2013-09-25 08:25:18
回答 2查看 127关注 0票数 0

只是遇到了一个问题。我正试图使wcf服务变得统一或更好,所有的代码都必须用unittest进行测试。

自动取款机,它不可能,coze,我有一个连接到crm 2011服务器,这是每次使用。

所以我用接口代替了它。但我想像你一样对WCF进行联合测试。

现在我的想法是公开一种方法,然后给出一个假连接。

现在我的问题是,即使它不在接口中,也可以调用这个方法(例如: ConnectionHandler)吗?

这个应该是这样的:

代码语言:javascript
复制
public interface IWCF
{
    [OperationContract]
    bool method1();

    [OperationContract]
    bool method2();
}

public class WCF:  IWCF
{

    public bool method1(){
    ...
    }

    public bool method2(){
    ...
    }

    private connection connectionHandler;
    public connection ConnectionHandler(Iconnection con){
        if(con != null){
            connectionHandler = con;
        } else {
            connectionHandler = takedefault;
        }
    }
}

编辑

啊,我忘了告诉你这个:我实际上是有安全意识的,我不希望任何人都能将一个不同的连接传递到服务器--它只是为了最单一的目的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-25 10:13:42

任何设计良好的代码的重要特性之一是,您对向客户公开的功能非常明确。这成为面向服务的应用程序的一个关键特性,因为您正在以标准化的方式公开您的功能,供外部客户端使用。

调用不属于接口的方法原则上是不好的,因为您现在正在为实现编程,而不是接口。幸运的是,WCF知道这一点,并且不会让您使用一个不在接口上的方法,因为它没有使用OperationContract属性进行修饰。

关于您的代码--我不知道您到底想实现什么--让客户端设置(我假设的是)--类似于数据库连接--让我感到有些不安(首先,这意味着您的服务处于与服务无国籍原则背道而驰的某种状态)。这并不意味着您所做的一定是错误的,但是您应该发现,在设计良好的应用程序中,您只需要很少违反这一点。

也就是说,如果您想向不同的客户端公开不同的功能区域,那么正确的方法是公开表示不同合同的服务上的端点:

代码语言:javascript
复制
[ServiceContract]
public interface IWCF
{
    [OperationContract]
    bool method1();

    [OperationContract]
    bool method2();
}

 [ServiceContract]
public interface IConnectionWCF
 {
     [OperationContract]
     bool SetConnection(string connection);
 }

 public class WCF : IWCF, IConnectionWCF
{
     public bool method1()
     {
        ...
     }

     public bool method2()
     {
        ...
     }

     public bool SetConnection(string connection)
     {
         ...
     }
}

您还需要注意,WCF服务接收到的所有内容都必须首先由客户端序列化,通过线路发送,然后在服务器上反序列化。您在这里处理的是具体的类,而不是抽象。将接口(如Iconnection)作为参数传递给服务调用在面向服务的环境中没有任何意义。

关于单元测试,请记住,从根本上说,类WCF只是一个简单的老类。您可以独立地测试这个类,因为它是一个WCF服务。无论如何,您不应该在单元测试中设置任何服务托管功能--您想要检查您编写的代码是否正确-- WCF堆栈已经由Microsoft进行了测试。

编辑

为了响应您的注释(如建议的这里 ),您应该在类实例化时使用构造函数注入来设置连接对象。这就引出了如何控制WCF服务实例化的问题。您需要实现IInstanceProvider,或者更详细的实现请参见这里。这样,当您的服务托管在WCF中时,您使用IInstanceProvider,在测试时,只需将假连接对象传递给构造函数。

编辑

为了澄清,这个类的单元测试类似于以下内容:

代码语言:javascript
复制
[TestClass]
public class UnitTests
{
    [TestMethod]
    public void Test()
    {
        Iconnection connection = new FakeConnection();
        WCF classUnderTest = new WCF(connection);

        //Run test logic
    }
}
票数 0
EN

Stack Overflow用户

发布于 2013-09-25 08:45:32

调用此方法是可能的,您可以将接口强制转换到具体对象。但是这会损害调用代码,而调用代码不应该知道服务的实现细节。

我会在您的坐姿中使用constrcutor注入,这样您的服务实现将如下所示:

代码语言:javascript
复制
 public interface IWCF
{
    [OperationContract]
    bool method1();

    [OperationContract]
    bool method2();
}

public class WCF:  IWCF
{
    private connection connectionHandler;

    public WCF(Iconnection con)
    {
         if(con != null){
            connectionHandler = con;
        } else {
            connectionHandler = takedefault;
        }
    }

    public bool method1(){
    ...
    }

    public bool method2(){
    ...
    }



}

在这种情况下,如果在客户端上使用constrcutor注入,客户端代码将不知道服务实现的细节。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18999806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档