2016-02-15 2 views
3

Могу ли я использовать C# щеголеватый, чтобы сделать что-то вроде этого:C# щеголеватый карта интерфейс

IFoo bar = _dbConnection.Query<IFoo>("My query there"); 

Теперь я не могу это сделать, из-за не impelemented конструктор без параметров по умолчанию.

Есть ли какой-то трюк, чтобы почитать богов ТВЕРДОГО (особенно духа Принципа замещения Лискова), или я должен оставить его как есть и отобразить мои данные не в IFoo, а в Foo?

Я действительно беспокоюсь о уважении к этим ТВЕРДЫМ вещам, но до сих пор не знаю, где я должен это делать, поэтому ища совет для этой конкретной ситуации.

+3

Mapping к интерфейсу не имеет смысла. Как Dapper должен знать, какой тип использовать? –

+0

Переменная может быть 'IFoo', но вы должны сказать Dapper, каков конкретный тип. – juharr

+0

Я не знаю, глупец. Но это было бы совершенно разумно. Когда вы запрашиваете интерфейс в NHibernate, он запрашивает все сопоставленные объекты, которые реализуют этот интерфейс. Кроме того, можно отображать интерфейсы, например, как базовый класс. –

ответ

5

Для создания экземпляра требуется конкретная реализация вашего класса. Внутри он должен создать новый объект. Вы не можете создать новый экземпляр интерфейса:

var foo = new IFoo(); // This won't build! 

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

IEnumerable<IFoo> foo = _dbConnection.Query<Foo>("My query there"); 
+0

Спасибо, самый простой ответ правильный, как всегда. –

+0

Для записи: Я могу показать примеры, где «Это не будет строить!»: * Будет * (все еще с 'IFoo' в качестве интерфейса). Но, по существу: да, это верно. 'Query ' фактически возвращает 'IEnumerable ', но это небольшая точка. –

+0

Я был бы рад, если вы покажете несколько примеров :) –

0

Один из способов организации репозитория - использовать объекты частного класса для запросов, но показывать результаты в виде открытых интерфейсов.

Pulbic Модель: реализация

namespace MyProject.Foo.Model 
{ 
    public interface IFoo 
    { 
     string Property1 { get; set; } 
     string Property2 { get; set; } 
    } 

    public interface IFooRepository 
    { 
     IEnumerbale<IFoo> GetFoos(); 
    } 
} 

Запрос с частным классом:

namespace MyProject.Foo.Repositories 
{ 
    public class FooRepository: IFooRepository 
    { 
     private class Foo: IFoo 
     { 
      public string Property1 { get; set; } 
      public string Property2 { get; set; } 
     } 

     public IEnumerbale<IFoo> GetFoos() 
     { 
      IEnumerable<IFoo> foo = _dbConnection.Query<Foo>("My query there"); 
      return foo; 
     } 
    } 
} 
Смежные вопросы