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
。另一种方法是生成更通用的序列化程序。请参见此示例以获取灵感。