Как избежать использования уровня доступа к данным на уровне представления? - PullRequest
0 голосов
/ 29 мая 2018

У меня есть слой данных, который использует Sqlite для работы CRUD, поэтому в моем Sqlite Class я должен передать путь к БД, для этого у меня есть интерфейс IConnectionProvider на уровне данных, как показано ниже:

public interface IConnectionProvider
 {
        string DbPath { get; }
 }

SqliteDb.cs

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 Ответ

0 голосов
/ 29 мая 2018

Обычный способ сделать это - использовать шаблон репозитория.Определите интерфейс в слое ViewModel и внедрите его в слой данных.Тогда ViewModel ничего не знает о DataLayer.Затем создайте экземпляр репозитория с помощью ConnectionProvider в вашем основном классе с помощью внедрения зависимостей.Также dbContext должен перейти на DataLayer, и вы должны использовать его в репозитории.Я бы порекомендовал поместить строку подключения в файл конфигурации и использовать ее в 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
}

Также ищите Принцип инверсии зависимости, поскольку это помогает в развязывании подобных вещей.

...