我希望有人能指出我重构一些接受泛型类型的方法。
我有一个与我的数据库中的许多不同表格对话的服务。大多数表格格式相同。该服务对所有表执行相同的基本操作,GetAll,Save,Delete。由于操作是一样的,我一直在寻找一种创建核心动作库的方法。
这是我的保存功能的一个例子,这与其他表的唯一区别是数据。所以这里是ClientData,下一个是GroupData等......
internal static void SaveClient(ClientData clientData)
{
using (CFOEntityModelContainer database = new CFOEntityModelContainer())
{
if (!IsClientValid(clientData.Id))
{
database.Clients.AddObject(ConvertClientDataToClient(clientData));
database.SaveChanges();
}
else
{
Client client = database.Clients.First(
c => c.Id == clientData.Id);
client.Name = clientData.Name;
database.SaveChanges();
}
}
}
建议?
答案 0 :(得分:2)
如果您的方法包含特定于类型的操作,您期望如何使其成为通用的?您是否始终拥有XXX实体和XXXData类,其中XXX实体包含Id
和Name
以及XXXData类包含Name
和Id
?如果不是你的通用保存只是模板接受委托给特定方法=没有简化。如果是,您可以执行以下操作:
首先准备泛型方法中使用的接口:
public interface IData
{
int Id { get; }
string Name { get; set; }
}
现在在您的实体和数据类上实现该接口并创建泛型方法:
internal static void Save<TEntity, TData>(TData data)
where TEntity : class, IData
where TData : class, IData
{
using (CFOEntityModelContainer database = new CFOEntityModelContainer())
{
ObjectSet<TEntity> set = database.CreateObjectSet<TEntity>();
// Here you have specific method - can you make it generic?
// If not it must be another parameter (delegate) passed to Save method
if (!IsValid(data.Id))
{
// Convert is another specific method which must be generalize
// This time it can be probably solved by overriding conversion
// operator on each data implementation
set.AddObject(Convert(data));
}
else
{
// Another specific logic - can you make it generic?
// If not it must be passed as delegate
TEntity entity = set.First(e => e.Id == data.Id);
entity.Name = data.Name;
}
database.SaveChanges();
}
}
您可以将此方法称为:
Save<Client, ClientData>(data);