Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Lazy Loading & Repository как подружить? / 24 сообщений из 24, страница 1 из 1
03.04.2013, 10:16
    #38210468
Nicky_N
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazy Loading & Repository как подружить?
Всем доброго дня!
классический код:
Код: 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.
53.
54.
55.
    public class Customer
    {
        public int CustomerID { get; set; }
        public string Name { get; set; }
        public ICollection<Account> Accounts { get; set; }
    }

    public class Account
    {
        public int AccountID { get; set; }
    }

    public interface ICustomerRepository
    {
        IEnumerable<Customer> GetCustomers();
        Customer GetCustomerByID(int customerID);
        void InsertCustomer(Customer customer);
        void UpdateCustomer(Customer customer);
        void DeleteCustomer(int customerID);
    }

    public class CustomerRepository : ICustomerRepository
    {
        public IEnumerable<Customer> GetCustomers()
        {
            List<Customer> customers = new List<Customer>();
            customers.Add(new Customer { CustomerID = 1, Name = "Customer1" });
            customers.Add(new Customer { CustomerID = 2, Name = "Customer2" });
            customers.Add(new Customer { CustomerID = 3, Name = "Customer3" });
            customers.Add(new Customer { CustomerID = 4, Name = "Customer4" });
            customers.Add(new Customer { CustomerID = 5, Name = "Customer5" });

            return customers;
        }

        public Customer GetCustomerByID(int customerID)
        {
            throw new NotImplementedException();
        }

        public void InsertCustomer(Customer customer)
        {
            throw new NotImplementedException();
        }

        public void UpdateCustomer(Customer customer)
        {
            throw new NotImplementedException();
        }

        public void DeleteCustomer(int customerID)
        {
            throw new NotImplementedException();
        }
    }


Хочется, чтобы Accounts подгружался "лениво", как это сделать БЕЗ использования вездесущего Entity Framework?
...
Рейтинг: 0 / 0
03.04.2013, 10:21
    #38210475
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazy Loading & Repository как подружить?
"Вам шашечки или ехать?" (с)
...
Рейтинг: 0 / 0
03.04.2013, 10:25
    #38210477
Nicky_N
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazy Loading & Repository как подружить?
Алексей К,

ехать с шашечками)
...
Рейтинг: 0 / 0
03.04.2013, 15:18
    #38211304
SolYUtor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazy Loading & Repository как подружить?
Nicky_N,

выкинуть репозиторий, и не страдать архитектурной ерундой.
...
Рейтинг: 0 / 0
03.04.2013, 16:22
    #38211493
Nicky_N
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazy Loading & Repository как подружить?
SolYUtor,

ок, а где и как организовывать взаимодействие с БД (я использую шаблон MVVM)?
...
Рейтинг: 0 / 0
03.04.2013, 16:44
    #38211539
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazy Loading & Repository как подружить?
[quot Nicky_N]Хочется, чтобы Accounts подгружался "лениво", как это сделать БЕЗ использования вездесущего Entity Framework?/quot]
Например:
Код: c#
1.
2.
3.
4.
5.
6.
7.
public class Customer
{
    public int CustomerID { get; set; }
    public string Name { get; set; }

    public Lazy<ICollection<Account>> Accounts { get; set; }
}
...
Рейтинг: 0 / 0
03.04.2013, 16:47
    #38211546
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazy Loading & Repository как подружить?
Или подумать над тем, как это реализовано в Entity Framework и сделать по аналогии.
...
Рейтинг: 0 / 0
03.04.2013, 17:17
    #38211617
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazy Loading & Repository как подружить?
SolYUtorNicky_N, выкинуть репозиторий, и не страдать архитектурной ерундой.
Репозиторий, датасервис или иная обертка по-любому нужна. Другое дело, что эта обертка может быть отнаследована от ef контекста или отдавать через паблик свойство доступ к контексту для телодвижений извне.

P.S. По вопросу: сделать в конструкторе параметр EfContext.Configuration.LazyLoadingEnabled?
...
Рейтинг: 0 / 0
03.04.2013, 17:21
    #38211625
Nicky_N
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazy Loading & Repository как подружить?
МСУ,

я в сабже просил без EntityFramework)
...
Рейтинг: 0 / 0
03.04.2013, 17:25
    #38211632
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazy Loading & Repository как подружить?
Nicky_NМСУ, я в сабже просил без EntityFramework)
А куда сейчас без Entity Framework? :)
...
Рейтинг: 0 / 0
03.04.2013, 17:28
    #38211638
Nicky_N
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazy Loading & Repository как подружить?
skyANA предложил интересную конструкцию: Lazy<T>, погуглил, вот что вышло:

Код: 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.
53.
54.
55.
    public class Customer
    {
        public int CustomerID { get; set; }
        public string Name { get; set; }
        public Lazy<List<Account>> Accounts { get; set; }
    }

    public class CustomerRepository : ICustomerRepository
    {
        public IEnumerable<Customer> GetCustomers()
        {
            List<Customer> customers = new List<Customer>();
            customers.Add(new Customer
            {
                CustomerID = 1,
                Name = "Customer1",
                Accounts = new Lazy<List<Account>>(() => { return GetAccountByCustomerID(1); })
            });
            customers.Add(new Customer
            {
                CustomerID = 2,
                Name = "Customer2",
                Accounts = new Lazy<List<Account>>(() => { return GetAccountByCustomerID(2); })
            });
            customers.Add(new Customer
            {
                CustomerID = 3,
                Name = "Customer3",
                Accounts = new Lazy<List<Account>>(() => { return GetAccountByCustomerID(3); })
            });
            customers.Add(new Customer
            {
                CustomerID = 4,
                Name = "Customer4",
                Accounts = new Lazy<List<Account>>(() => { return GetAccountByCustomerID(4); })
            });
            customers.Add(new Customer
            {
                CustomerID = 5,
                Name = "Customer5",
                Accounts = new Lazy<List<Account>>(() => { return GetAccountByCustomerID(5); })
            });

            return customers;
        }

        private List<Account> GetAccountByCustomerID(int customerID)
        {
            List<Account> list = new List<Account>();
            list.Add(new Account { AccountID = 100, CustomerID = customerID });
            list.Add(new Account { AccountID = 200, CustomerID = customerID });

            return list;
        }
    }


Не хочу показаться догматиком, но меня волнует место метода GetAccountByCustomerID. Это как бы метод репозитария Account?
...
Рейтинг: 0 / 0
03.04.2013, 17:31
    #38211645
Nicky_N
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazy Loading & Repository как подружить?
МСУА куда сейчас без Entity Framework? :)
а вот куда: Oracle 9i R2, первый нативный ODAC без поддержки EF, + отказ на начальном этапе от использования NHibernate. так что только ADO.Net, только хардкор))
...
Рейтинг: 0 / 0
03.04.2013, 17:46
    #38211673
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazy Loading & Repository как подружить?
Nicky_NOracle 9i R2
На помойку старьё: http://download.oracle.com/oll/obe/EntityFrameworkOBE/EntityFrameworkOBE.htm

Nicky_Nотказ на начальном этапе от использования NHibernate.
Зачем отказались от этого замечательного ORM?

Nicky_Nтак что только ADO.Net, только хардкор))
ССЗБ :)
...
Рейтинг: 0 / 0
03.04.2013, 17:50
    #38211682
Nicky_N
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazy Loading & Repository как подружить?
МСУНа помойку старьё: http://download.oracle.com/oll/obe/EntityFrameworkOBE/EntityFrameworkOBE.htm


Prerequisites
Before starting this tutorial, you should:

2. Install Oracle Database 10.2 or later or Oracle Database XE.

я б с радостью перешел на более новую версию, но от меня в этом вопросе, к сожалению, ничего не зависит.
...
Рейтинг: 0 / 0
03.04.2013, 17:52
    #38211686
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazy Loading & Repository как подружить?
Nicky_NНе хочу показаться догматиком, но меня волнует место метода GetAccountByCustomerID. Это как бы метод репозитария Account?Нет такой догмы, делать отдельный репозитарий на каждую сущность. Делайте как считаете нужным.

Сcылка для почитать: Проблемный шаблон Repository .
...
Рейтинг: 0 / 0
03.04.2013, 17:59
    #38211698
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazy Loading & Repository как подружить?
Nicky_Nя б с радостью перешел на более новую версию, но от меня в этом вопросе, к сожалению, ничего не зависит.
Да верю, верю. Просто нахрена было отказываться от хибернейта, не понимаю.
...
Рейтинг: 0 / 0
03.04.2013, 19:32
    #38211805
Nicky_N
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazy Loading & Repository как подружить?
МСУ,

я не совсем правильно выразился. когда проект стартовал - хибернейт даже не рассматривали (вот так вот ужас!), а потом через 4 года столько уже было понаписано, что уже и не стали)
...
Рейтинг: 0 / 0
03.04.2013, 19:41
    #38211815
kmaw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazy Loading & Repository как подружить?
предположу:

GetCustomers - выдача списка Customer с Accounts = null - это для формирования формы журнала
GetCustomerByID - выдача Customer по ID с Accounts != null - это для формирования формы карточки

тогда просто в первом методе не заполнять Accounts, а во втором, соответственно, заполнять.
...
Рейтинг: 0 / 0
03.04.2013, 19:49
    #38211819
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazy Loading & Repository как подружить?
Nicky_NМСУ,

я не совсем правильно выразился. когда проект стартовал - хибернейт даже не рассматривали (вот так вот ужас!), а потом через 4 года столько уже было понаписано, что уже и не стали)

Ну так самое время рассмотреть его внедрение. Старые лохмотья пусть тухнут, новые допилы - через прямые руки. Не?
...
Рейтинг: 0 / 0
03.04.2013, 19:52
    #38211822
SolYUtor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazy Loading & Repository как подружить?
Nicky_NSolYUtor,

ок, а где и как организовывать взаимодействие с БД (я использую шаблон MVVM)?
Преимущественно использовать шаблон DbContext Per Form. Контекст передавать прямо в VM, при закрытии формы SaveChanges или CancelChanges, смотря что там юзер накликал.
...
Рейтинг: 0 / 0
03.04.2013, 20:00
    #38211829
Nicky_N
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazy Loading & Repository как подружить?
kmaw,

вроде как бы уже решил проблему с помощью Lazy<T>.
...
Рейтинг: 0 / 0
03.04.2013, 20:03
    #38211831
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazy Loading & Repository как подружить?
SolYUtorNicky_NSolYUtor,

ок, а где и как организовывать взаимодействие с БД (я использую шаблон MVVM)?
Преимущественно использовать шаблон DbContext Per Form. Контекст передавать прямо в VM, при закрытии формы SaveChanges или CancelChanges, смотря что там юзер накликал.
Бред. Особенно неадекватен при работе с вебом.
...
Рейтинг: 0 / 0
03.04.2013, 20:05
    #38211834
Nicky_N
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazy Loading & Repository как подружить?
МСУNicky_NМСУ,

я не совсем правильно выразился. когда проект стартовал - хибернейт даже не рассматривали (вот так вот ужас!), а потом через 4 года столько уже было понаписано, что уже и не стали)

Ну так самое время рассмотреть его внедрение. Старые лохмотья пусть тухнут, новые допилы - через прямые руки. Не?

я не смогу всем переломать хребет) и так вот пытаюсь: тут тебе MVVM, тут тебе Repository pattern - глядишь, когда случится чудо с переводом на новую версию БД или использованием хибернейта - останется только DAL переписать!
...
Рейтинг: 0 / 0
03.04.2013, 20:08
    #38211838
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazy Loading & Repository как подружить?
Nicky_N, ок, отлипаю :)
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Lazy Loading & Repository как подружить? / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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