这可能是我天真的表现,但无论如何......
我有一个通用接口,它定义了一组跨实现的标准方法(以不同方式实现)。
我将接口作为参数传递给方法,该方法负责持久化到数据库。例如,我有一些称为bug,事件等的实现,它们是从通用接口(称为IEntry)定义的。这些概念实现也使用IEnumerable
由于错误与事件不同,因此存在不同的字段。当我将接口作为参数传递给方法时,有没有办法推断出类型?因此,如果我传入Bug对象,我可以使用其字段,这些字段与Incident中的字段不同。这些字段对于数据库的持久性非常有用。我假设没有,因为没有办法知道传递的类型(显然),但我知道这里的人有更多的智慧。在这种情况下,有更好的做事方式吗?由于相似性,我想坚持接口。
编辑:我想另一种方法是使用一些流控制来动态生成sql语句,然后将其作为参数传递。
谢谢
发布于 2019-07-15 09:26:16
糟糕的设计(我认为在问题中描述):
public interface IEntry
{
string Description { get; set; }
}
public class Bug : IEntry
{
public int ID { get; set; }
public string Description { get; set; }
public string UserName { get; set; }
}
public class Incident : IEntry
{
public Guid ID { get; set; }
public string Description { get; set; }
}
public class Persister
{
public void Save(IEnumerable<IEntry> values)
{
foreach (IEntry value in values) { Save(value); }
}
public void Save(IEntry value)
{
if (value is Bug) { /* Bug save logic */ }
else if (value is Incident) { /* Incident save logic */ }
}
}
改进的设计(智能实体方法):
public interface IEntry
{
string Description { get; set; }
void Save(IPersister gateway);
}
public class Bug : IEntry
{
public int ID { get; set; }
public string Description { get; set; }
public string UserName { get; set; }
public void Save(IPersister gateway)
{
gateway.SaveBug(this);
}
}
public class Incident : IEntry
{
public Guid ID { get; set; }
public string Description { get; set; }
public void Save(IPersister gateway)
{
gateway.SaveIncident(this);
}
}
public interface IPersister
{
void SaveBug(Bug value);
void SaveIncident(Incident value);
}
public class Persister : IPersister
{
public void Save(IEnumerable<IEntry> values)
{
foreach (IEntry value in values) { Save(value); }
}
public void Save(IEntry value)
{
value.Save(this);
}
public void SaveBug(Bug value)
{
// Bug save logic
}
public void SaveIncident(Incident value)
{
// Incident save logic
}
}
改进的设计仅满足需要更改Persister.Save(IEntry)的需要。我只想展示使代码不那么脆弱的第一步。在现实和生产代码中,您可能希望拥有BugPersister和IncidentPersister类,以符合单一责任原则。
希望这个以代码为中心的例子是一个帮助。
https://stackoverflow.com/questions/-100001298
复制相似问题