Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос по архитектуре / 25 сообщений из 40, страница 1 из 2
09.04.2016, 00:19
    #39211539
Артем G
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по архитектуре
Есть 2 библиотеки,
в первой библиотеке есть класс в конструкторе которого есть интерфейс. Вторая библиотека добавлена в референс в первой библиотеки.
во второй библиотеке этот интерфейс и плюс класс к которому имплементирован этот интерфейс.

вопрос. правильно ли то, что интерфейс во второй библиотеке.
думаю что неправильно.
думаю что интерфейс должен быть в первой библиотеке, там же, где он используется в конструторе класса.

PS
Вот на примере из жизни.
1я библиотека бизнес логика имеет класс UserService, который содержит в конструкторе IUserRepository.
2я библиотека слой данных и имеет класс UserRepository, который имплементирован от IUserRepository.

Думаю перетащить IUserRepository в 1ю библиотеку, чтобы если придеться заменять 2ю библиотку, то 1я не должна будет "сыпаться".
Так же думаю IUserService перетащить в клиент из логики.

Что скажите? спрашиваю потому как чую, что сейчас не правильно, но не уверен что так правильно потому как в гугл-примерах, так как сейчас у меня.
...
Рейтинг: 0 / 0
09.04.2016, 00:47
    #39211543
Артем G
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по архитектуре
Попробывал перетащить итерфес и пришел к выводу что вероятно они должны быть вообще в отдельной сборке.
...
Рейтинг: 0 / 0
09.04.2016, 01:06
    #39211546
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по архитектуре
Артем GЧто скажите? лучше код покажи, а то фраза "в конструкторе которого есть интерфейс" уже за гранью добра и зла.

конструктор это Sub New, как в нем может быть описан интерфейс - загадка.
...
Рейтинг: 0 / 0
09.04.2016, 01:11
    #39211547
Артем G
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по архитектуре
AntonariyАртем GЧто скажите? лучше код покажи, а то фраза "в конструкторе которого есть интерфейс" уже за гранью добра и зла.

конструктор это Sub New, как в нем может быть описан интерфейс - загадка.
кусок кода для примера
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
     public class UserService : IUserService
    {
        private readonly IUserRepository userRepository;

        public UserService(IUserRepository userRepository)
        {
            this.userRepository = userRepository;
        }



почитал вот тут линк
пишут что создаются persistence layers между слоем данных и логикой и между логикой и интерфейсом
...
Рейтинг: 0 / 0
09.04.2016, 02:26
    #39211560
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по архитектуре
Артем Gкусок кода для примерагде тут одна библиотека, где вторая? где описание интерфейса и вообще всего того, о чем идет речь в первом посте?
...
Рейтинг: 0 / 0
09.04.2016, 03:23
    #39211562
Артем G
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по архитектуре
ох, думал на словах будет проще для все ... ситуция то "будничная"
ок, раз на словах ни как, тогда выложу код днем. сейчас 4ый час ночи...
спасибо за желание помочь.
...
Рейтинг: 0 / 0
09.04.2016, 08:17
    #39211575
zz118
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по архитектуре
Все зависит то того, что хочется получить в результате. Поясню на двух примерах:

1. В зависимости от фазы луны мы хотим работать или с файловой системой, или с БД. Тогда выделяем классы, специфичные для типа хранилища в отдельную сборку, а их интерфейс вообще отдельно.

FileSystemRepository.dll
Код: c#
1.
internal class FileSystemRepository : IRepository {}



DatabaseRepository.dll
Код: c#
1.
internal class DatabaseRepository: IRepository {}



Contracts.dll
Код: c#
1.
public interface IRepository {}



SomeUsage.dll
Код: c#
1.
2.
3.
4.
internal class DepenencyConsumer 
{
    public DepenencyConsumer(IRepository repository)
}



Соответственно зависимости:
SomeUsage.dll -> Contracts.dll
DatabaseRepository.dll -> Contracts.dll
FileSystemRepository.dll -> Contracts.dll

2. Мы пишем библиотеку FileSystemRepository.dll, которую поставляем как часть SDK. Тогда мы хотим сделать код закрытым для модификаций, тогда все по другому

FileSystemRepository.dll
Код: c#
1.
2.
3.
internal class FileSystemRepository : IRepository {}

public interface IRepository {}



SomeUsage.dll
Код: c#
1.
2.
3.
4.
internal class DepenencyConsumer 
{
    public DepenencyConsumer(IRepository repository)
}



Зависимости:
SomeUsage.dll -> FileSystemRepository.dll

Я оставил за скобкой как именно инъектируются зависимости, но думаю с этим не должно возникнуть проблем.
...
Рейтинг: 0 / 0
09.04.2016, 08:37
    #39211579
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по архитектуре
Артем G, IUserService, IUserRepository, UserService в одной сборке... Реализация IUserRepository в другой.
И кстати интерфейс IUserService наверняка на фиг не нужен.
...
Рейтинг: 0 / 0
09.04.2016, 08:47
    #39211582
zz118
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по архитектуре
skyANAАртем G, IUserService, IUserRepository, UserService в одной сборке... Реализация IUserRepository в другой.
И кстати интерфейс IUserService наверняка на фиг не нужен.

Не получится тогда что реализация IUserRepository ссылается на собственного потребителя?
...
Рейтинг: 0 / 0
09.04.2016, 13:00
    #39211641
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по архитектуре
zz118skyANAАртем G, IUserService, IUserRepository, UserService в одной сборке... Реализация IUserRepository в другой.
И кстати интерфейс IUserService наверняка на фиг не нужен.

Не получится тогда что реализация IUserRepository ссылается на собственного потребителя?
Бррр... Ну и формулировочка :)

Очевидно, что мы добавим референс на сборку, где реализуется нужный нам интерфейс. Или подключим её иным способом. Но что тут может вызывать не понимания?
...
Рейтинг: 0 / 0
09.04.2016, 13:02
    #39211642
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по архитектуре
Хотя может я Вас не верно понял..

Потребитель реализации IUserRepository - это UserService. При этом ссылки реализации на потребителя нет. Где Вы её усмотрели?
...
Рейтинг: 0 / 0
09.04.2016, 14:36
    #39211656
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по архитектуре
Продемонстрирую картинкой..
...
Рейтинг: 0 / 0
09.04.2016, 15:33
    #39211667
zz118
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по архитектуре
skyANAПри этом ссылки реализации на потребителя нет. Где Вы её усмотрели?
В примере на картинке Data ссылается на DomainModel, в которой расположен потребитель репозитория. Такая реализация плохо масштабируема, так как при увеличении числа потребителей и/или интерфейсов (например, при применении I. из S.O.L.I.D.) сборка Data становится "жадной".
...
Рейтинг: 0 / 0
09.04.2016, 15:53
    #39211669
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по архитектуре
zz118, конкретный пример привести можете?

Речь ведь не об абстрактном репозитории, а о конкретном I User Repository, что должен возвращать не что иное как User -ов.
...
Рейтинг: 0 / 0
09.04.2016, 16:32
    #39211674
zz118
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по архитектуре
Попробую:

Шаг 1. Обычный CRUD
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
// ---------- Repository.dll -------------
internal class UserRepository : IUserRepository
{
    IEnumerable<User> Get() {...}

    void Set (IList<User> users) {...}
}
....
// ---------- MyDomain.dll -------------
public interface IUserRepository
{
    IEnumerable<User> Get();

    void Set (IList<User> users);
}



Шаг 2. Прикручиваем отчетный движок к пользователям
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
// ---------- Repository.dll -------------
public class UserRepository : IUserProducer, IUserRepository
{
    IEnumerable<User> Get() {...}

    void Set (IList<User> users) {...}
}

....
// ---------- MyDomain.dll -------------
public interface IUserRepository
{
    IEnumerable<User> Get();

    void Set (IList<User> users);
}
// ---------- MyReportingDomain.dll -------------
public interface IUserProducer
{
    IEnumerable<User> Get();
}



Шаг 3. Прикручиваем приложение для win-mobile с ограниченным функционалом
Код: 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.
// ---------- Repository.dll -------------
public class UserRepository : IUserProducer, IUserRepository, ISimpleUserProvider
{
    IEnumerable<User> Get() {...}

    void Set (IList<User> users) {...}

    IEnumerable<UserDto> SimpleGet() {...}
}

....
// ---------- MyDomain.dll -------------
public interface IUserRepository
{
    IEnumerable<User> Get();

    void Set (IList<User> users);
}
// ---------- MyReportingDomain.dll -------------
public interface IUserProducer
{
    IEnumerable<User> Get();
}
// ---------- MyMobileDomain.dll -------------
public interface ISimpleUserProvider
{
    IEnumerable<UserDto> SimpleGet() {...}
}



Все бы ничего, но проблема находится вот в этой строке:
Код: c#
1.
public class UserRepository : IUserProducer, IUserRepository, ISimpleUserProvider


Из-за нее мы в каждый из трех доменов тянем лишние сборки которые там могут быть в принципе не релевантны. Вдобавок, UserRepository начинает обладать знаниями о том кто и как его использует. Как следствие, мы не сможем разрабатывать его отдельно.
...
Рейтинг: 0 / 0
09.04.2016, 16:50
    #39211677
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по архитектуре
zz118, амн... А при чём тут моё предложение: "IUserRepository, UserService в одной сборке... Реализация IUserRepository в другой"?

Реализаций IUserRepository может быть несколько, каждая в своей сборке. И каждая из них будет зависеть только от того, что ей действительно нужно.

И соответсвенно в конкретном приложении будет подключена конкретная сборка.
...
Рейтинг: 0 / 0
09.04.2016, 18:35
    #39211695
Артем G
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по архитектуре
skyANAzz118, амн... А при чём тут моё предложение: "IUserRepository, UserService в одной сборке... Реализация IUserRepository в другой"?

Реализаций IUserRepository может быть несколько, каждая в своей сборке. И каждая из них будет зависеть только от того, что ей действительно нужно.

И соответсвенно в конкретном приложении будет подключена конкретная сборка.
1. Создал проект на GitHub Для того, чтобы можно было глянуть в живую что и как
2. На картинке видно что IUserRepository в сборке DataAccess. Там где реализация, то есть вместе с UserRepository.
Видно что сборка BusinessLogic использует IUserRepository в конструкторе.

Я все еще в процессе обучения и поэтому не знаю как правильно. Этот вариант был взят из интернета.
Я засомневалася что IUserRepository толжен быть с сборке DataAccess.

Теперь вопросы.
1. Оставить IUserRepository в DataAccess? - это правильно?
2. Перенсти в BusinessLogic. Как тогда имплементировать IUserRepository для UserRepository?
3. Создать отдельную сборку (видел вариант с названием Persistent) которая добавляется и в BusinessLayer и в DataAccess.

4. Если переносим IUserRepository из DataAccess что делать с моделями. На картинке видно что DataAccess имеет модель User
а IUserRepository содержит функцию User GetUser(int Id);

Вобщем вопросов куча (( не понять толком как правильно ...

...
Рейтинг: 0 / 0
09.04.2016, 18:49
    #39211697
zz118
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по архитектуре
автор1. Оставить IUserRepository в DataAccess? - это правильно?

да

автор4. Если переносим IUserRepository из DataAccess что делать с моделями. На картинке видно что DataAccess имеет модель User
а IUserRepository содержит функцию User GetUser(int Id);

POCO объекты доменной модели лучше держать в отдельной сборке MyProject.BusinessObjects, MyProject.Entities, MyProject.DomainModel...
...
Рейтинг: 0 / 0
09.04.2016, 19:13
    #39211707
Артем G
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по архитектуре
zz118автор1. Оставить IUserRepository в DataAccess? - это правильно?
да
автор4. Если переносим IUserRepository из DataAccess что делать с моделями. На картинке видно что DataAccess имеет модель User
а IUserRepository содержит функцию User GetUser(int Id);
POCO объекты доменной модели лучше держать в отдельной сборке MyProject.BusinessObjects, MyProject.Entities, MyProject.DomainModel...
Ок понял. Сделаю именно так.
Но все же переспрошу. Студенческий вопрос :). То есть это нормально, что в сборке BusinessLogic требуется IUserRepository, но сборка не предоставляет возможности использовать саму сборку без сборки DataAccess в которой IUserRepository находится?

PS/ в дополнение...
Сейчас понимаю, что если я перенсу IUserRepository в BusinessLogic то придется или подключать Domain в котором будет модель User, дополнительно не понять как имплементировать IUserRepository во время реализации UserRepository (наверное ни как :) ).


Спасибо за ответы.
...
Рейтинг: 0 / 0
09.04.2016, 19:39
    #39211716
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по архитектуре
Артем G1. Оставить IUserRepository в DataAccess? - это правильно?
2. Перенсти в BusinessLogic. Как тогда имплементировать IUserRepository для UserRepository?
3. Создать отдельную сборку (видел вариант с названием Persistent) которая добавляется и в BusinessLayer и в DataAccess.
Не место IUserRepository в одной сборке с конкретным UserRepository.
Можете конечно оставить там, тогда реализацию надо вынести в сборку: DataAccess.SqlClient, или DataAccess.NHibernate, или DataAccess.EntityFramework, или DataAccess.MongoDB, - в зависимости от начинки этой самой реализации.
...
Рейтинг: 0 / 0
09.04.2016, 19:50
    #39211720
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по архитектуре
Артем G, вот зачем в BusinessLogic ссылка на DataAccess?

В том проекте, где используете логику (консолька, сервис, сайт, формы), там и добавляйте ссылку на ту реализацию доступа к данным, что нужна.
...
Рейтинг: 0 / 0
09.04.2016, 19:52
    #39211724
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по архитектуре
zz118POCO объекты доменной модели лучше держать в отдельной сборке MyProject.BusinessObjects, MyProject.Entities, MyProject.DomainModel...И что это даст и в каких случаях?
...
Рейтинг: 0 / 0
09.04.2016, 20:31
    #39211732
Артем G
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по архитектуре
skyANAАртем G, вот зачем в BusinessLogic ссылка на DataAccess?
В том проекте, где используете логику (консолька, сервис, сайт, формы), там и добавляйте ссылку на ту реализацию доступа к данным, что нужна.
На скрине что выше видно, что сейчас IUserRepository в DataAccess, и в BusinessLogic в конструкторе UserService. Поэтому ссылка.
На скрине что ниже видно что в консоле ссылка на BusinessLogic и в консоле используется UserService.

skyANAАртем G1. Оставить IUserRepository в DataAccess? - это правильно?
2. Перенсти в BusinessLogic. Как тогда имплементировать IUserRepository для UserRepository?
3. Создать отдельную сборку (видел вариант с названием Persistent) которая добавляется и в BusinessLayer и в DataAccess.
Не место IUserRepository в одной сборке с конкретным UserRepository.
Можете конечно оставить там, тогда реализацию надо вынести в сборку: DataAccess.SqlClient, или DataAccess.NHibernate, или DataAccess.EntityFramework, или DataAccess.MongoDB, - в зависимости от начинки этой самой реализации.
Идея с DataAccess.EntityFramework очень даже симпотична. Выглядит логично. Cпасибо.

...
Рейтинг: 0 / 0
09.04.2016, 23:38
    #39211786
Артем G
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по архитектуре
Артем Gzz118пропущено...
да
пропущено...
POCO объекты доменной модели лучше держать в отдельной сборке MyProject.BusinessObjects, MyProject.Entities, MyProject.DomainModel...
Ок понял. Сделаю именно так.
Но все же переспрошу. Студенческий вопрос :). То есть это нормально, что в сборке BusinessLogic требуется IUserRepository, но сборка не предоставляет возможности использовать саму сборку без сборки DataAccess в которой IUserRepository находится?
PS/ в дополнение...
Сейчас понимаю, что если я перенсу IUserRepository в BusinessLogic то придется или подключать Domain в котором будет модель User, дополнительно не понять как имплементировать IUserRepository во время реализации UserRepository (наверное ни как :) ).
Спасибо за ответы.
Если есть у кого-нибудь ответ на вопрос, то интересно было бы услышать.
...
Рейтинг: 0 / 0
10.04.2016, 08:04
    #39211847
zz118
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по архитектуре
Артем GЕсли есть у кого-нибудь ответ на вопрос, то интересно было бы услышать.

Я постарался описать сценарий, когда это не нормально (когда нужно "на лету" переключать зависимости). Не похоже что это Ваш случай, так что не вижу никаких рисков в такой зависимости.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос по архитектуре / 25 сообщений из 40, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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