为了账号安全,请及时绑定邮箱和手机立即绑定

如何避免在表示层使用数据访问层?

如何避免在表示层使用数据访问层?

C#
波斯汪 2021-06-28 12:57:22
我有一个使用 Sqlite 进行 CRUD 操作的数据层,所以在我的 Sqlite 类中,我必须传递一个数据库的路径,为此我IConnectionProvider在数据层中有如下接口:public interface IConnectionProvider {        string DbPath { get; } }数据库文件public class SQLiteDb : DbContext, IDbContext    {        internal const string DefaultDatabaseName = "My.db";        private string connectionString = null;        public SQLiteDb(IConnectionProvider connectionProvider)        {            this.connectionString = connectionProvider.DbPath;        }        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)        {            optionsBuilder.UseSqlite(connectionString);        }    }我的项目架构如下: Data Layer -> View Model -> Presentation Layer我想避免将数据层直接用于表示层,但要传递 DBPath,我必须添加对它的引用。下面是IConnectionProvider在我的表示层中的实现:public class SqlConnectionProvider : IConnectionProvider    {        public string dbPath = string.Empty;        public string DbPath        {            get            {                if (string.IsNullOrEmpty(dbPath))                {                    dbPath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "MyDb.sqlite");                }                return dbPath;            }        }  }有什么办法可以避免将 DataLayer 直接用于表示层?我想在 VM 中创建包装器,但我认为这不是一个好主意,因为会创建更多的依赖项。
查看完整描述

1 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

执行此操作的常用方法是使用存储库模式。在 ViewModel 层定义一个 Interface 并在 DataLayer 中实现。那么 ViewModel 对 DataLayer 一无所知。然后通过依赖注入在主类中使用 ConnectionProvider 实例化存储库。此外,dbContext 必须移动到 DataLayer,您应该在 Repository 中使用它。我建议将连接字符串放在配置文件中并在 DL 中使用它。这些类应该看起来像这样


namespace ViewModel;

interface IDatabaseRepository {

   DataObject LoadData()

}


namespace DataLayer;

class DataRepository {

   public DataRepository(DbContext context) {

      this.context = context;

   }


   public DataObject LoadData() {

      //load data from DB using dbContext

   }

}


namespace ViewModel;

class ViewModel {

   public ViewModel(IDataRepository repository) {

      this.repository = repository;

   }


   // use the repository inside this class to acces data

}

还可以查看依赖倒置原则,因为这有助于解耦这样的事情。


查看完整回答
反对 回复 2021-07-10
  • 1 回答
  • 0 关注
  • 206 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信