代码之家  ›  专栏  ›  技术社区  ›  Razor

使用LINQ to SQL实体从UI代码中分离数据

  •  1
  • Razor  · 技术社区  · 15 年前

    如果让数据访问“远离”业务层和表示层很重要,那么我可以采取哪些替代方法或方法,以便我的LINQ to SQL实体可以留在数据访问层中?

    到目前为止,我似乎只是简单地复制sqlmetal生成的类,并传递这些对象,而不是简单地保留两层appart。

    例如,我在数据库中有一个名为books的表。如果用户正在通过UI创建一本新书,那么由sqlmetal生成的book类似乎是一个完美的匹配,尽管我这样做是紧密耦合了我的设计。

    2 回复  |  直到 15 年前
        1
  •  0
  •   djdd87    15 年前

    我要做的是在一个项目中拥有所有的数据访问(在您的例子中是linq to sql),然后我拥有另一个使用数据访问项目的业务项目,从而从UI层分离数据访问项目。

    在您的Books示例中,我的业务层将有一个名为Book的类:

    public class Book
    {
    
        private IAuthorRespository _authorRepository = new LinqToSqlAuthorRepository();
        private IBookRespository _bookRepository = new LinqToSqlBookRepository();
    
        public int BookId { get { return _bookId; }}
        private int _bookId;
    
        public virtual string BookName{get;set;}
        public virtual string ISBN {get;set;}
        // ...Other properties
    
        public Book()
        {
            // When creating a new book
            _bookId = 0;
        }
    
        public Book(int id)
        {
            // For an existing book
            _bookId = id;
            Load();
        }
    
        protected void Load()
        {
            BookEntity book = _bookRepository.GetBook(BookId);
            BookName = book.BookName;
            ISBN = book.ISBN;
        }
    
        public void Save()
        {
            BookEntity book = MapEntityFromThisClass();
            _bookRepository.Save(book);
        }
    
        public Author GetAuthor()
        {
            return _authorRepository.GetAuthor();
        }
    
    }
    

    这意味着您的UI与实际的数据访问完全分离,并且您的所有书籍逻辑都被合理地包含在一个类中。

    通过将IOC与Microsoft Unity或Castle这样的系统结合使用,您可以进一步分离,这样就不必编写 = new LinqToSqlXYZ(); 而是可以写一些东西 IoC.Resolve<IBookRepostory>(); (取决于您的实现)。这意味着您的Book类也不再绑定到Linq to SQL了。

        2
  •  0
  •   Peter Willis    15 年前

    LINQtoSQL提供实体和数据库表之间的1:1映射。可以说,实体本身是从数据库中抽象出来的一个层次,而这正是您所依赖的。

    如果您正在对Linq to SQL提供的实体进行1:1的复制,那么这可能意味着不值得将它们放在那里,因为您仍然像与Linq to SQL提供的实体一样与这些类绑定。

    通过创建另一个层,您还可以消除Linq to SQL提供的更改跟踪的好处,这意味着您必须将类中的任何更改复制到Linq to SQL提供的实体中,才能执行数据操作。

    如果你想把 DataContext 从任何表示层或业务层键入代码,并更严格地控制数据的接口,这样存储库模式就很好了。您可以始终让存储库返回由Linq to SQL创建的实体类型,这意味着您没有复制类型,您还可以获得更改跟踪,但您仍然保留控制 数据上下文 在存储库中。

    为了展示(视图模型)或业务逻辑的好处,您可以考虑将数据投影到不同的类中。如果我想使用Linq to SQL,这是我倾向于采用的路线,但我不希望实体和视图模型之间的1:1映射。