Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#泛型/设计模式:我应该使用模板方法吗?_C#_Web Services_Design Patterns_Generics - Fatal编程技术网

C#泛型/设计模式:我应该使用模板方法吗?

C#泛型/设计模式:我应该使用模板方法吗?,c#,web-services,design-patterns,generics,C#,Web Services,Design Patterns,Generics,场景: (如果最近有人回答/查看了我的问题,这将有点家喻户晓) 我有3个不同的web服务,它们公开了一组具有公共性的对象。我已经编写了包装类和转换逻辑,使用通用方法在中间对象和服务对象之间进行更改 我有一个Web服务的接口,为了解决这个问题,让它被称为IService。我有3个实现类Service1Impl、Service2Impl和Service3Impl。其中每一个都引用不同的web服务,并使用前面提到的通用方法在适当的对象之间进行转换 它们在运行时通过构造函数注入到我的ServiceWra

场景:

(如果最近有人回答/查看了我的问题,这将有点家喻户晓)

我有3个不同的web服务,它们公开了一组具有公共性的对象。我已经编写了包装类和转换逻辑,使用通用方法在中间对象和服务对象之间进行更改

我有一个Web服务的接口,为了解决这个问题,让它被称为IService。我有3个实现类Service1Impl、Service2Impl和Service3Impl。其中每一个都引用不同的web服务,并使用前面提到的通用方法在适当的对象之间进行转换

它们在运行时通过构造函数注入到我的ServiceWrapper类中(工厂用于创建iSeries的相应实现)

e、 g:

将给我一个用Service2Impl实例化的ServiceWrapper

(该死的图表会非常有用!)

好的,因此IService的每个实现都有一个为参数而调用的方法。.GetProperties:

public IProperty[] GetProperties(string item, IProperty[] properties)
{
    Property[] props = ServiceObjectFactory.CreateProperties<Property>(properties);
    Property[] result = _service.GetProperties(item, props);
    return ServiceObjectFactory.CreateProperties(result);
}
公共IProperty[]GetProperties(字符串项,IProperty[]properties) { Property[]props=ServiceObjectFactory.CreateProperties(属性); 属性[]结果=_service.GetProperties(项目、道具); 返回ServiceObjectFactory.CreateProperties(结果); } 这看起来有点混乱(我想我要重构名称)

基本上,正在发生的是:

  • ServiceWrapper对此函数的调用是通过中间对象(IProperty)实现的(从参数中可以看到)

  • 中间对象将转换为特定于服务的属性对象

  • 结果作为特定于服务的属性对象返回

  • 结果在传递回ServiceWrapper之前转换为中间对象

  • 现在,Service1Impl、Service2Impl和Service3Impl的代码将完全相同。当然,除了使用的类型不同之外

    有谁能想出一个方法来做到这一点,这样我就不会有相同的代码3次


    N.B:并非每个实现中的每个方法都是如此。只是大多数方法。

    我不确定它是否适合您的场景,但通读您的问题会让我想起。

    我不确定它是否适合您的场景,但通读您的问题会让我想起。

    我一般认为,如果您想要您的cod要有不同的类型签名,您必须编写三次不同的代码。由于类型不同,它根本不是“同一代码”


    您可以将您拥有的内容放入继承的方法中,然后将结果包装到每个子类中。

    我认为,一般来说,如果您希望您的代码具有不同的类型签名,那么您必须编写三次不同的代码。由于类型不同,它根本不是“同一代码”

    您可以将您拥有的内容放入继承的方法中,然后将结果包装到每个子类中

    public IProperty[] GetProperties(string item, IProperty[] properties)
    {
        Property[] props = ServiceObjectFactory.CreateProperties<Property>(properties);
        Property[] result = _service.GetProperties(item, props);
        return ServiceObjectFactory.CreateProperties(result);
    }