powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Как подменить базу данных
18 сообщений из 18, страница 1 из 1
Как подменить базу данных
    #38777227
в ступоре
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую всех.
Есть проект на LINQ. Там есть репозитарий работает через UoW.

код
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
public interface IRepository<T>  where T : class
{
    void Add(T entity);
    // другие методы
}

public interface IUnitOfWork : IDisposable
{
    void Commit();
}

// добавляем реализацию интерфейса в автокласс DataClassesDataContext - то что сгенерировал наш L2S 
partial class DataClassesDataContext : IUnitOfWork
{
    public void Commit()
    {
        this.SubmitChanges();
    }
}

public abstract class RepositoryBase<T> : IRepository<T>
    where T : class
{
    protected System.Data.Linq.DataContext  db { get; set; } // привязано

    virtual public void Add(T entity)
    {
        // ...
    }

    // другие методы
}

public class AccountRepository : RepositoryBase<Account>
{
    public AccountRepository(IUnitOfWork uof)
    {
        db = uof as DataClassesDataContext; // привязано
    }

     // реализация других методов
}

ну и где-то там

using (IUnitOfWork uow = new DataClassesDataContext())
{
    var usersRepo = new UserRepository(uow);
    var accountRepo = new AccountRepository(uow);
    // ...
    uow.Commit()
}



Это делал не я. Теперь мне дали задание это наследство сделать так что можно было менять L2S на другие контексты БД - Entity и т.п.

Я пока плохо разбираюсь в теме и не могу свести в едино - помогите. Как изменить репозиторий и др. так чтобы можно было потом привязать контекст БД в одном месте к интерфейсу и всё бы резолвилось через IoC/DI.
Как бы переключать на разные базу на другую с минимальными изменениями. Получится ли сделать единый репозиторий?
...
Рейтинг: 0 / 0
Как подменить базу данных
    #38777243
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фаулер предлагает использовать для этого шаблон Стратегия.
...
Рейтинг: 0 / 0
Как подменить базу данных
    #38777308
в ступоре
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA,

Хорошо, а что в данной ситуации мне делать? Я уже обчитался теорий и окончательно запутался.
...
Рейтинг: 0 / 0
Как подменить базу данных
    #38777325
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в ступоре, перечислите для начала какие "контексты" требуется поддерживать и какой IoC контейнер используете.
...
Рейтинг: 0 / 0
Как подменить базу данных
    #38777334
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И условия, от которых зависит выбор "контекста".
...
Рейтинг: 0 / 0
Как подменить базу данных
    #38777343
Фотография EDUARD SAPOTSKI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кхм. А можно поинтересоваться на кой нужно контексты менять?
...
Рейтинг: 0 / 0
Как подменить базу данных
    #38777346
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Также можно поступить проще: реализовать по репозиторию для каждого "контекста".

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public abstract class LinqRepositoryBase<T> : IRepository<T>
    where T : class
{
    protected System.Data.Linq.DataContext  db { get; set; } // привязано

    virtual public void Add(T entity)
    {
        // ...
    }

    // другие методы
}


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public abstract class MongoDbRepositoryBase<T> : IRepository<T>
    where T : class
{
    protected :MongoDB.Driver.MongoDatabase db { get; set; }

    virtual public void Add(T entity)
    {
        // ...
    }

    // другие методы
}
...
Рейтинг: 0 / 0
Как подменить базу данных
    #38777348
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EDUARD SAPOTSKIКхм. А можно поинтересоваться на кой нужно контексты менять?Ну например данные от разных поставщиков этих самых данных забирать :)
...
Рейтинг: 0 / 0
Как подменить базу данных
    #38777353
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Также может хотят реализовать Polyglot Persistence.
...
Рейтинг: 0 / 0
Как подменить базу данных
    #38777379
в ступоре
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANAТакже можно поступить проще: реализовать по репозиторию для каждого "контекста".

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public abstract class LinqRepositoryBase<T> : IRepository<T>
    where T : class
{
    protected System.Data.Linq.DataContext  db { get; set; } // привязано

    virtual public void Add(T entity)
    {
        // ...
    }

    // другие методы
}


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public abstract class MongoDbRepositoryBase<T> : IRepository<T>
    where T : class
{
    protected :MongoDB.Driver.MongoDatabase db { get; set; }

    virtual public void Add(T entity)
    {
        // ...
    }

    // другие методы
}


Тогда получается что базовый репозиторий по сути один и тот же только поле db меняется. Или у Монго другая схема доступа к данным? т.е. получить из Монго db.Users.Where(... как в L2S - имена таблиц не совпадают? И в Entity?
...
Рейтинг: 0 / 0
Как подменить базу данных
    #38777383
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, ещё в качестве "контекста" можно рассматривать кэширование:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public class RepositoryCacheDecorator<T> : IRepository<T> where T : IEntity
{
    private readonly Couchbase.CouchbaseClient cacheClient;
    private readonly IRepository<T> repository;

    public void Save(T entity)
    {
        cacheClient.ExecuteRemove(entity.Id);
        repository.Save(entity);
        cacheClient.ExecuteStore(entity.Id, entity);
    }
}
...
Рейтинг: 0 / 0
Как подменить базу данных
    #38777393
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в ступореТогда получается что базовый репозиторий по сути один и тот же только поле db меняется. Или у Монго другая схема доступа к данным? т.е. получить из Монго db.Users.Where(... как в L2S - имена таблиц не совпадают? И в Entity?У Вас тема называется "Как подменить базу данных".

То есть базы данных минимум две. Они обе реляционные? Схема у них одинаковая/разная?

MongoDB - это документо-ориентированная СУБД. Ясен пень в общем случае там другая схема :)
...
Рейтинг: 0 / 0
Как подменить базу данных
    #38777405
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в ступоре, а зачем вообще свойство db доступно наследникам?
...
Рейтинг: 0 / 0
Как подменить базу данных
    #38777429
Фотография EDUARD SAPOTSKI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAУ Вас тема называется "Как подменить базу данных".
Так я про то же, сначала про БД, а затем:

в ступоресделать так что можно было менять L2S на другие контексты БД - Entity и т.п.
ХЗ что ТС хочет.
Если менять БД то лучше заюзать EF и менять провайдеры. Переписывать придется не много.
А если менять L2SQL на EF и т.д. то хз зачем это и с трудом представляю как это сделать.
...
Рейтинг: 0 / 0
Как подменить базу данных
    #38777440
в ступоре
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANAв ступоре, а зачем вообще свойство db доступно наследникам?
Я не знаю - не я писал. Лучше сделать приватным?

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

Например для Unity.
Код: c#
1.
2.
3.
4.
IUnityContainer uc = new UnityContainer();
uc.RegisterType<IRepository, ???? >();

IRepository repository = uc.Resolve<IRepository>();


Совсем запутался.
...
Рейтинг: 0 / 0
Как подменить базу данных
    #38777441
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EDUARD SAPOTSKI, да другую стратегию доступа к данным ТС хочет реализовать (называет просто своими словами "схема доступа к данным").
У Фаулера можешь почитать как.
...
Рейтинг: 0 / 0
Как подменить базу данных
    #38777459
Фотография EDUARD SAPOTSKI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAда другую стратегию доступа к данным ТС хочет реализовать (называет просто своими словами "схема доступа к данным").
У Фаулера можешь почитать как.
Ясно.
...
Рейтинг: 0 / 0
Как подменить базу данных
    #38777463
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в ступореskyANAв ступоре, а зачем вообще свойство db доступно наследникам?
Я не знаю - не я писал. Лучше сделать приватным?Лучше разобраться как свойство используется и на вопрос ответить.
Я же спросил не "Какого хера", а "Зачем" :)

в ступореПолучается, что без собственного репозитория к контексту не обойтись.
Тогда нужно менять сам репозиторий чтобы в контроллерах не менять ничего.
Не могу сообразить как это лучше сделать. Ведь для регистрации контейнера нужна конкретная реализация а не шаблон Т.
На примере StructureMap:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public A : IEntity
{
    // ...
} 

public B : IEntity
{
    // ...
} 

public class MyRegistry : StructureMap.Configuration.DSL.Registry
{
    public MyRegistry()
    {
        For<IRepository<A>>().Use<Repository>();
        For<IRepository<B>>().Use(ctx => new RepositoryCacheDecorator<B>(new Repository<B>()));
    }
}

Вуаля. Сущности класса B у нас кэшируются, а сущности класса A нет.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Как подменить базу данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]