c# 通用存储库 class
c# Generic Repository class
我有各种具有 DeleteEntity 方法的存储库类:
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);
}
现在每个存储库 class 都有相同的方法。只有存储过程的名称发生变化。如何制作通用删除方法并将其作为参数 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 或 otroRepository:
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());
}
}
我有各种具有 DeleteEntity 方法的存储库类:
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);
}
现在每个存储库 class 都有相同的方法。只有存储过程的名称发生变化。如何制作通用删除方法并将其作为参数 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 或 otroRepository:
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());
}
}