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

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

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

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

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

конструктор это Sub New, как в нем может быть описан интерфейс - загадка.
...
Рейтинг: 0 / 0
Вопрос по архитектуре
    #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
Вопрос по архитектуре
    #39211560
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем Gкусок кода для примерагде тут одна библиотека, где вторая? где описание интерфейса и вообще всего того, о чем идет речь в первом посте?
...
Рейтинг: 0 / 0
Вопрос по архитектуре
    #39211562
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ох, думал на словах будет проще для все ... ситуция то "будничная"
ок, раз на словах ни как, тогда выложу код днем. сейчас 4ый час ночи...
спасибо за желание помочь.
...
Рейтинг: 0 / 0
Вопрос по архитектуре
    #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
Вопрос по архитектуре
    #39211579
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем G, IUserService, IUserRepository, UserService в одной сборке... Реализация IUserRepository в другой.
И кстати интерфейс IUserService наверняка на фиг не нужен.
...
Рейтинг: 0 / 0
Вопрос по архитектуре
    #39211582
zz118
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАртем G, IUserService, IUserRepository, UserService в одной сборке... Реализация IUserRepository в другой.
И кстати интерфейс IUserService наверняка на фиг не нужен.

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

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

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

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

Речь ведь не об абстрактном репозитории, а о конкретном I User Repository, что должен возвращать не что иное как User -ов.
...
Рейтинг: 0 / 0
Вопрос по архитектуре
    #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
Вопрос по архитектуре
    #39211677
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zz118, амн... А при чём тут моё предложение: "IUserRepository, UserService в одной сборке... Реализация IUserRepository в другой"?

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

И соответсвенно в конкретном приложении будет подключена конкретная сборка.
...
Рейтинг: 0 / 0
Вопрос по архитектуре
    #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
Вопрос по архитектуре
    #39211697
zz118
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор1. Оставить IUserRepository в DataAccess? - это правильно?

да

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

POCO объекты доменной модели лучше держать в отдельной сборке MyProject.BusinessObjects, MyProject.Entities, MyProject.DomainModel...
...
Рейтинг: 0 / 0
Вопрос по архитектуре
    #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
Вопрос по архитектуре
    #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
Вопрос по архитектуре
    #39211720
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем G, вот зачем в BusinessLogic ссылка на DataAccess?

В том проекте, где используете логику (консолька, сервис, сайт, формы), там и добавляйте ссылку на ту реализацию доступа к данным, что нужна.
...
Рейтинг: 0 / 0
Вопрос по архитектуре
    #39211724
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zz118POCO объекты доменной модели лучше держать в отдельной сборке MyProject.BusinessObjects, MyProject.Entities, MyProject.DomainModel...И что это даст и в каких случаях?
...
Рейтинг: 0 / 0
Вопрос по архитектуре
    #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
Вопрос по архитектуре
    #39211786
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Артем Gzz118пропущено...
да
пропущено...
POCO объекты доменной модели лучше держать в отдельной сборке MyProject.BusinessObjects, MyProject.Entities, MyProject.DomainModel...
Ок понял. Сделаю именно так.
Но все же переспрошу. Студенческий вопрос :). То есть это нормально, что в сборке BusinessLogic требуется IUserRepository, но сборка не предоставляет возможности использовать саму сборку без сборки DataAccess в которой IUserRepository находится?
PS/ в дополнение...
Сейчас понимаю, что если я перенсу IUserRepository в BusinessLogic то придется или подключать Domain в котором будет модель User, дополнительно не понять как имплементировать IUserRepository во время реализации UserRepository (наверное ни как :) ).
Спасибо за ответы.
Если есть у кого-нибудь ответ на вопрос, то интересно было бы услышать.
...
Рейтинг: 0 / 0
Вопрос по архитектуре
    #39211847
zz118
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем GЕсли есть у кого-нибудь ответ на вопрос, то интересно было бы услышать.

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


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