C# 使用接口实现CRUD

C# 使用接口实现CRUD,c#,architecture,crud,C#,Architecture,Crud,使用将用于抽象DAL操作的接口在BL上实现CRUD的最佳方法是什么?我需要你们的意见,伙计们 这是我的草稿 在数据库表中映射的数据实体 public class Student { public string StudentId { get; set; } public string StudentName { get; set; } public Course StudentCourse { get; set; } } public class Course

使用将用于抽象DAL操作的接口在BL上实现CRUD的最佳方法是什么?我需要你们的意见,伙计们

这是我的草稿

在数据库表中映射的数据实体

 public class Student
 {
    public string StudentId { get; set; }
    public string StudentName { get; set; }
    public Course StudentCourse { get; set; }
 }

 public class Course
 {
    public string CourseCode { get; set; }
    public string CourseDesc { get; set; }
 }
我创建了一个CRUD接口来抽象对象的操作

public interface IMaintanable<T>
{
   void Create(T obj);
   T Retrieve(string key);
   void Update(string key);
   void Delete(string key);
 }
正如您所看到的,update方法存在相当多的异常

    public void Update()
    {
        // should update the record in the DB
    }
此方法应该使用什么来更新“对象”属性?我应该继承学生吗

    public class StudentManager : Student , IMaintainable<Student>
    {
        public void Update()
        {
            //update record via DAL
         }
    }


    public void Button_SaveStudent(Event args, object sender)
    {
        Student student = new StudentManager();
        student.StudentId = "1";
        student.StudentName = "Cnillincy"
        student.Update()
    }
公共班级学生管理员:学生,可维护
{
公共无效更新()
{
//通过DAL更新记录
}
}
公共无效按钮\u SaveStudent(事件参数,对象发送者)
{
学生=新学生经理();
student.StudentId=“1”;
student.StudentName=“cnillency”
student.Update()
}
或者我应该只包含学生类作为学生管理员的属性吗

     public class StudentManager : IMaintainable<Student>
    {
        public Student student { get; private set };

        public void Create() {}
        public void Update() {}
        public void Retrieve() {}
        public void Delete() {}
    }
公共班级学生管理员:IMaintainable
{
公立学生学生{get;private set};
public void Create(){}
public void Update(){}
public void Retrieve(){}
public void Delete(){}
}

哪个更合适?界面怎么样?还有其他建议吗?谢谢..C

您的CRUD界面可能看起来像

public interface IMaintanable<T>
{
    string Create(T obj);
    T Retrieve(string key);
    void Update(T obj);
    void Delete(string key);
}
公共接口可维护
{
字符串创建(T obj);
T检索(字符串键);
无效更新(T obj);
作废删除(字符串键);
}
也就是说,
Create
Update
都会复制要更新的对象。不同之处在于,
Update
可以从
obj
获取
,因此它知道正在更改哪个对象<代码>创建通常会导致创建密钥,因此您将其作为返回值传递回去。希望有帮助


(更新也可能会传回密钥。)

我不会让StudentManager继承Student,我会让我的更新方法像创建方法一样无状态,即

public interface IMaintanable<T>
{
  void Create(T obj);
  T Retrieve(string key);
  void Update(T obj);
  void Delete(string key);
}

我从罗伯·科纳利那里看到了这个,我非常喜欢。它的威力在于可以传递给方法的参数的灵活性。在我看来,您的实现不够健壮。请在这里查看他的MVC初学者工具包(这里称为ISession)

公共接口可维护:IDisposable
{
T Single(表达式),其中T:class,new();
System.Linq.IQueryable All(),其中T:class,new();
void Add(T项),其中T:class,new();
无效更新(T项),其中T:class,new();
void Delete(T项),其中T:class,new();
void Delete(表达式),其中T:class,new();
void DeleteAll(),其中T:class,IEntity,new();
无效提交更改();
}

就个人而言,我认为您所缺少的只是适当的术语。这实际上是一个非常有用的模式的近似值,称为存储库模式。就类型识别而言,实现将被称为通用存储库

过去我个人实现的方式是有一个定义存储库的接口,如
IRepository
,以及一个特定于存储库类型的基类,如
SqlRepositoryBase
。我这样做的原因是我可以将特定于实现的代码放在基类中。因此,管道已经完成,我可以担心最终存储库中特定于域的实现,这将是
StudentRepository
,一个
SqlRepository
(或者
SqlRepository,如果您为实体定义了接口)

似乎您关心的是实例化了多少对象,我可以告诉您,您并没有产生足够大的资源消耗,因此没有真正关心以这种方式实现。老前辈可能会对这一事实感到畏缩,但我们不再试图优化64k或RAM它更多的是关于可维护性、代码契约等

不要预先增加不需要的复杂性,但是如果您正在考虑将不同类型的多个实体登记到原子事务中,那么您可能还需要研究工作单元模式

以下是关于这些主题的一些很好的参考资料:

一般来说,这有两个好处(IMHO):

  • 我个人不同意存储库模式方法只在大型项目中有用的假设;特别是通用存储库模式。如果您开始将这样的代码放入一个可重用的库中,您会惊讶于您可以多么快地开始创建一个宝贵的构建块资源

  • 这种方法最大的优点是它的可测试性;甚至比可重用性更重要。如果您希望模拟您的存储库以使用任何类型的TDD方法,那么您可以轻松地完成这项工作。这将允许您在整个代码中围绕存储库的用法编写更丰富的测试

看看最近发布的新版本。它们以“按约定编码”模型为特色,允许您轻松地将业务对象直接映射到数据库,而无需担心DAL

“Gu”概述了映射对象是多么容易,甚至在通过它使用的DbContext模型链接到数据库时做一些简单的修改


值得注意的是,当前版本是CTP4,但我预计大多数问题都已经通过该框架解决了,应该可以很好地为您服务。

我对这里的回答做了一些修改,如下所示:

public interface IMaintanable<T>
{
    Guid Create(T obj);
    T Read(Guid key);
    bool Update(T obj);
    bool Delete(Guid key);
}
公共接口可维护
{
Guid创建(T obj);
T读取(Guid键);
bool更新(T obj);
bool删除(Guid键);
}
此接口基于我的数据库结构。我为pri使用GUI
public interface IMaintanable<T>
{
  void Create(T obj);
  T Retrieve(string key);
  void Update(T obj);
  void Delete(string key);
}
public void Update(T obj)
{
  // should update the record in the DB
}
public interface IMaintainable : IDisposable
    {
       T Single<T>(Expression<Func<T, bool>> expression) where T : class, new();
       System.Linq.IQueryable<T> All<T>() where T : class, new();
       void Add<T>(T item) where T : class, new();
       void Update<T>(T item) where T : class, new();
       void Delete<T>(T item) where T : class, new();
       void Delete<T>(Expression<Func<T, bool>> expression) where T : class, new();
       void DeleteAll<T>() where T : class, IEntity, new();
       void CommitChanges();
    }
public interface IMaintanable<T>
{
    Guid Create(T obj);
    T Read(Guid key);
    bool Update(T obj);
    bool Delete(Guid key);
}