C# 与战略模式相关的设计问题

C# 与战略模式相关的设计问题,c#,C#,我正在尝试实现一种策略模式,但不确定如何将策略接口作为 通用的 请参见下面的示例代码: public interface ISerializer { XDocument Serialize(PharmacyProductDto presetDataDto); XDocument Serialize(PatientDto presetDataDto); PrescriberDto Deserialize(PrescriberDto xDocument); } p

我正在尝试实现一种策略模式,但不确定如何将策略接口作为 通用的

请参见下面的示例代码:

 public interface ISerializer
 {
    XDocument Serialize(PharmacyProductDto presetDataDto);
    XDocument Serialize(PatientDto presetDataDto);
    PrescriberDto Deserialize(PrescriberDto xDocument);
 }

  public class XmlSerializer : ISerializer
  {
    public XDocument Serialize(PharmacyProductDto presetDataDto)
    {
        return new XDocument();
    }

    public XDocument Serialize(PatientDto presetDataDto)
    {
        return new XDocument();
    }

    public PrescriberDto Deserialize(PrescriberDto xDocument)
    {
        return new PrescriberDto();
    }
  }

  public class PatientDto
  {
  }

public class PrescriberDto
{
}

public class PharmacyProductDto
{
}
在这里您可以看到基本上序列化不同DTO的ISerializer。 XmlSerializer类在序列化许多类型时变得非常笨拙。此外,我将在将来添加更多类型

我想在这里实施一种战略模式。大概是这样的:

public interface ISerializerStrategy
    {
        XDocument Serialize(PatientDto presetDataDto);
        PatientDto Deserialize(XDocument xDocument);
    }

public class PatientDtoSerializerStrategy : ISerializerStrategy
{

}

public class PrescriberDtoSerializerStrategy : ISerializerStrategy
{

}
但是您可以看到,
ISerializerStrategy
对于
PatientTo
非常具体。我如何使这个接口抽象或泛型,这也将工作
规定序列化策略


有人能给我提个建议吗

使用通用接口:

public interface ISerializerStrategy<T>
{
    XDocument Serialize(T presetDataDto);
    T Deserialize(XDocument xDocument);
}

public class PatientDtoSerializerStrategy : ISerializerStrategy<PatientDto>
{
    XDocument Serialize(PatientDto presetDataDto);
    PatientDto Deserialize(XDocument xDocument);
}

public class PrescriberDtoSerializerStrategy : ISerializerStrategy<PrescriberDto>
{
    XDocument Serialize(PrescriberDto presetDataDto);
    PrescriberDto Deserialize(XDocument xDocument);
}
公共接口策略
{
XDocument序列化(T presetDataDto);
T反序列化(XDocument XDocument);
}
公共类患者序列化策略:iSeries策略
{
XDocument序列化(PatientTo预设数据到);
PatientTo反序列化(XDocument XDocument);
}
公共类处方序列化策略:ISerializer策略
{
XDocument Serialize(PrescriberedTo presetDataDto);
规定反序列化(XDocument XDocument);
}
用法

public class Foo
{
    public Foo(ISerializerStrategy<PrescriberDto> serializer)
    {
        // ...
    }
}
公共类Foo
{
public Foo(ISerializer策略序列化程序)
{
// ...
}
}
注册

container.RegisterType<ISerializerStrategy<PrescriberDto>, PrescriberDtoSerializerStrategy>(); 
container.RegisterType();

使用通用接口:

public interface ISerializerStrategy<T>
{
    XDocument Serialize(T presetDataDto);
    T Deserialize(XDocument xDocument);
}

public class PatientDtoSerializerStrategy : ISerializerStrategy<PatientDto>
{
    XDocument Serialize(PatientDto presetDataDto);
    PatientDto Deserialize(XDocument xDocument);
}

public class PrescriberDtoSerializerStrategy : ISerializerStrategy<PrescriberDto>
{
    XDocument Serialize(PrescriberDto presetDataDto);
    PrescriberDto Deserialize(XDocument xDocument);
}
公共接口策略
{
XDocument序列化(T presetDataDto);
T反序列化(XDocument XDocument);
}
公共类患者序列化策略:iSeries策略
{
XDocument序列化(PatientTo预设数据到);
PatientTo反序列化(XDocument XDocument);
}
公共类处方序列化策略:ISerializer策略
{
XDocument Serialize(PrescriberedTo presetDataDto);
规定反序列化(XDocument XDocument);
}
用法

public class Foo
{
    public Foo(ISerializerStrategy<PrescriberDto> serializer)
    {
        // ...
    }
}
公共类Foo
{
public Foo(ISerializer策略序列化程序)
{
// ...
}
}
注册

container.RegisterType<ISerializerStrategy<PrescriberDto>, PrescriberDtoSerializerStrategy>(); 
container.RegisterType();

是否将序列化始终序列化为xml?@Nkosi:是。我想迈克尔的帮助就是我要找的人。但是,因为在我以前的实现中,我使用注入接口,但现在使用通用接口,我不确定如何使用它。是否将序列化始终序列化为xml?@Nkosi:是的。我想迈克尔的帮助就是我要找的人。但是,因为在我以前的实现中,我使用注入接口,但是现在使用通用接口,我不确定如何使用itThanks进行大量回复。但现在我遇到了另一个问题。在旧的实现中,我通过unity容器将ISerializer注入到其他类中,以便通过。但是对于您的解决方案,现在接口是通用的ISerializer策略。我怎么注射呢?或者在这种情况下使用它,您必须依赖于
ISerializerStrategy
。另一种方法是生成更通用的序列化程序。请看这个例子以获取灵感。非常感谢您的回复。但现在我遇到了另一个问题。在旧的实现中,我通过unity容器将ISerializer注入到其他类中,以便通过。但是对于您的解决方案,现在接口是通用的ISerializer策略。我怎么注射呢?或者在这种情况下使用它,您必须依赖于
ISerializerStrategy
。另一种方法是生成更通用的序列化程序。请参见此示例以获取灵感。