c#通用存储库类
我有各种存储库类别,它们具有如下DeleteEntity方法:c#通用存储库类,c#,repository,C#,Repository,我有各种存储库类别,它们具有如下DeleteEntity方法: public void DeleteEntity(int Key) { try { ObjectParameter error = new ObjectParameter("Error", typeof(string)); context.proc_BorrarChofer(Key, error);
public void DeleteEntity(int Key)
{
try
{
ObjectParameter error = new ObjectParameter("Error", typeof(string));
context.proc_BorrarChofer(Key, error);
if (error.Value.ToString() != "")
{
Errores myerror = new Errores();
myerror.ID = 100;
myerror.Descripcion = error.Value.ToString();
MyErrors.Add(myerror);
}
}
catch (DbUpdateConcurrencyException ex)
{
// Update the values of the entity that failed to save from the store
ex.Entries.Single().Reload();
// status = ex.Message;
Errores myerror = new Errores();
myerror.ID = 1000;
myerror.Descripcion = ex.Message.ToString();
MyErrors.Add(myerror);
}
catch (DbUpdateException ex)
{
string status = (ex.InnerException.InnerException != null) ? ex.InnerException.InnerException.Message : "";
Errores myerror = new Errores();
myerror.ID = 1000;
myerror.Descripcion = status;
MyErrors.Add(myerror);
}
catch (Exception ex)
{
//paso los errores
Errores myerror = new Errores();
myerror.ID = 1000;
myerror.Descripcion = ex.Message.ToString();
MyErrors.Add(myerror);
}
现在,每个存储库类都有相同的方法。只有存储过程的名称会更改。如何创建一个通用的Delete方法并作为参数sp Name传递
谢谢 在您的位置上,我将使用模板设计模式重新编写此代码
public abstract class BaseRepository
{
protected abstract void DeleteEntityWithProcedure(int key, ObjectParameter error);
public void DeleteEntity(int Key)
{
try
{
ObjectParameter error = new ObjectParameter("Error", typeof(string));
DeleteEntityWithProcedure(key, error);
if (error.Value.ToString() != "")
{
Errores myerror = new Errores();
myerror.ID = 100;
myerror.Descripcion = error.Value.ToString();
MyErrors.Add(myerror);
}
}
catch (DbUpdateConcurrencyException ex)
{
// Update the values of the entity that failed to save from the store
ex.Entries.Single().Reload();
// status = ex.Message;
Errores myerror = new Errores();
myerror.ID = 1000;
myerror.Descripcion = ex.Message.ToString();
MyErrors.Add(myerror);
}
catch (DbUpdateException ex)
{
string status = (ex.InnerException.InnerException != null) ? ex.InnerException.InnerException.Message : "";
Errores myerror = new Errores();
myerror.ID = 1000;
myerror.Descripcion = status;
MyErrors.Add(myerror);
}
catch (Exception ex)
{
//paso los errores
Errores myerror = new Errores();
myerror.ID = 1000;
myerror.Descripcion = ex.Message.ToString();
MyErrors.Add(myerror);
}
}
您的具体存储库将是这样的
public class CustomerRepository:BaseRepository
{
protected override DeleteEntityWithProcedure(int key, ObjectParameter error)
{
//execute procedure you needed
//context.proc_BorrarChofer(Key, error);
}
}
执行自定义存储库
var customerRepository = new CustomerRepository();
customerRepository.DeleteEntity(1);
前面的答案很好用。我会按照适配器设计模式来做。这使我们能够集中您的工作,并允许您在不影响前端实现的情况下创建不同的实现。这种模式在这里很有用,因为我们将可用的接口转换为所需的接口 首先,我们创建接口
public interface IEntity
{
void DeleteEntity(int key, Error error);
}
然后,我们根据需要创建尽可能多的存储库。例如:ChoferRepository或otrepository:
public class ChoferRepository: IEntity
{
public void DeleteEntity(int key, Error error)
{
// todo: Add your custom code here.
// You coul implement not only any store procedure but any data source
}
}
public class OtroRepository: IEntity
{
public void DeleteEntity(int key, Error error)
{
// todo: Add your custom code here.
// You coul implement not only any store procedure but any data source
}
}
最后是我们的执行
/// <summary>
/// This is just an example on how to implement your generic approach using the adapter pattern
/// </summary>
public class WebClient
{
IEntity ChoferEntity { get; set; }
IEntity OtraEntity { get; set; }
public WebClient()
{
//You can use as many repositories as you want knowing they all could have different data sources or different store procedures inside same data source
ChoferEntity.DeleteEntity(1, new Error());
OtraEntity.DeleteEntity(1, new Error());
}
}
//
///这只是一个关于如何使用适配器模式实现通用方法的示例
///
公共类网络客户端
{
熵选择{get;set;}
第三实体{get;set;}
公共网络客户端()
{
//您可以使用任意多个存储库,因为它们都可以在同一数据源中具有不同的数据源或不同的存储过程
ChoferEntity.DeleteEntity(1,新错误());
DeleteEntity(1,新错误());
}
}
您的意思是这一行context.proc\u BorrarChofer(Key,error)代码>存储库中的更改?完全正确。每个存储库都必须调用不同的sp来删除实体。其余的对于所有的存储库来说都是一样的。如果他有不同的存储库实现,这是个好主意,如果我们切换存储库,我们不想更改我们的客户机代码。但是主题作者说问题在于代码重复(所有的Delete
方法几乎都是一样的),他想让代码更通用。就个人而言,我不认为这有助于解决这个问题。使用这种方法的好处之一是客户机不关心实体是如何被删除的。我们可以使用相同的方法,例如删除实体。在此,适配器负责通过或执行部分或全部操作。在我看来,我们不应该决定在存储库中使用什么样的数据源或存储过程。这种方法为升级相互依赖的组件提供了一个很好的选择。例如,当更改到另一个存储过程或添加任何其他更改时。好主意!谢谢但“error”参数不应该由ref传递给DeleteEntityWithProcedure吗?