我应该在哪里将比较器放在使用WCF的应用程序中?

时间:2009-10-07 18:21:43

标签: c# wcf architecture service

我有一个使用WCF进行所有DataAccess的应用程序。它返回一些业务对象,并且有一些操作。

我的客户或我的服务中是否存在此代码?如果在服务中,我该如何实现它?我可以简单地将其添加为业务对象的接口吗?这会通过WCF服务代理代码吗?

(这是来自MSDN的一个示例,我希望在实现自己之前获得一些反馈,但它将是99%相同的)

// Custom comparer for the Product class.
class ProductComparer : IEqualityComparer<Product>
{
    // Products are equal if their names and product numbers are equal.
    public bool Equals(Product x, Product y)
    {

        // Check whether the compared objects reference the same data.
        if (Object.ReferenceEquals(x, y)) return true;

        // Check whether any of the compared objects is null.
        if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
            return false;

        // Check whether the products' properties are equal.
        return x.Code == y.Code && x.Name == y.Name;
    }

    // If Equals() returns true for a pair of objects,
    // GetHashCode must return the same value for these objects.

    public int GetHashCode(Product product)
    {
        // Check whether the object is null.
        if (Object.ReferenceEquals(product, null)) return 0;

        // Get the hash code for the Name field if it is not null.
        int hashProductName = product.Name == null ? 0 : product.Name.GetHashCode();

        // Get the hash code for the Code field.
        int hashProductCode = product.Code.GetHashCode();

        // Calculate the hash code for the product.
        return hashProductName ^ hashProductCode;
    }
}

2 个答案:

答案 0 :(得分:3)

嗯,WCF生成的代理是partial类,因此即使您使用的是mex代,也可以在客户端添加行为。

您也可以在命令行中使用程序集共享(/reference,或者在IDE中选中复选框) - 然后您可以在客户端和服务器上使用完全相同的类型,但它违反了大多数规则“纯粹的”SOA。

这取决于你感觉到的“纯粹”,我猜。纯粹但必须保持两个相似的代码库的痛苦可能超过了方便但是集合共享的肮脏。这取决于应用程序是什么。我很高兴在很多场合使用过汇编,我觉得没有内疚感;这是该场景最明智的选择。

请记住,客户端代码是便利 - 始终将客户端视为敌对,因此即使您的客户端使用程序集共享,请记住恶意客户端可能不会,所以不会遵守你的规则;总是在服务器上验证。

答案 1 :(得分:2)

请记住,通过WCF(或通过任何类型的基于SOAP的服务)传输的数据仅为消息。它们没有任何行为(它不会互操作),所以你的所有好行为都会在翻译中丢失。

这意味着您实际上只有一个选项:您的业务逻辑必须驻留在服务中,因为它不能驻留在客户端上。

也就是说,有几种方法可以在服务和客户端之间共享代码,但除非您纯粹将WCF用作通信堆栈,否则不建议这样做,因为它会将客户端和服务绑定在一起,并使其关闭不可能独立改变这两者(更不用说让新客户使用该服务)。