Проблемы с запросом NHibernate LINQ в слабосвязанном проекте - PullRequest
1 голос
/ 23 сентября 2011

надеюсь, что вы можете помочь!

Я запустил проект в MVC 3 и установил модель бизнес-домена в другой сборке, интерфейсы определяют контракт между этой сборкой и всеми проектами, которые будут ее использовать. Я использую Ninject для внедрения зависимостей в проект. В данный момент я столкнулся с кирпичной стеной с помощью конкретного запроса LINQ.

    public IEnumerable<ITheInterface> DoMyQuery()
    {
        using (ISession session = _sessionFactory.OpenSession()) {
            var query = (
                from c in session.Query<IMyInterface>()
                where something == anotherthing
                group c by new { c.TheGrouper } into grp
                select new IMyInterface() {
                    Property = grp.Key
                }
            );

            return query.ToList();
        }
    }

Теперь, очевидно, я не могу создать интерфейс, но это моя проблема! Единственный способ обойти это - создать конкретный класс, но это нарушает мои правила слабой связи. Кто-нибудь еще сталкивался с этим раньше?

Полагаю, мой вопрос в том, как мне использовать «выбрать новый объект» в запросе LINQ, используя интерфейс, а НЕ конкретный класс?

Примечание: просто для справки, даже если я использую свой конкретный класс, чтобы просто заставить его работать, я получаю ошибку NHibernate «Не удалось разрешить свойство: Ключ:» ... но это другая проблема.

Любая помощь приветствуется !!

Ответы [ 2 ]

2 голосов
/ 24 сентября 2011

Простое использование интерфейсов и контейнера DI не означает, что вы пишете слабосвязанный код. Интерфейсы должны использоваться в приложении Швы , а не для сущностей:

Шов - это место, где вы можете изменить поведение в вашей программе. без редактирования в этом месте

С Марк Нидхэм :

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

Сущности (доменные объекты) являются ядром вашего приложения. Когда вы меняете их, вы меняете их вместо . Однако создание Seam вокруг вашего кода доступа к данным - очень хорошая идея. Это реализовано с использованием шаблона Repository . Linq, ICreteria, HQL - это просто деталь реализации, скрытая от потребителей за интерфейсом хранилища, управляемым доменом. Как только вы представите одну из этих технологий доступа к данным, ваш проект будет связан с ними, и его будет сложнее протестировать. Пожалуйста, посмотрите на эти две статьи и это и это ответы:

0 голосов
/ 23 сентября 2011

Я считаю, что сеанс вызова. Запрос () недопустим, потому что NHibernate не знает о вашем намерении, что «некоторый сопоставленный класс (реализованный где-то) является правильным классом для запроса».

Чтобы оставаться слабосвязанными (новый оператор является зависимостью), вы должны использовать фабричный шаблон (объекты DAO), отвечающий за создание (запрос) конкретных нужных вам сущностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...