C# Dapper映射到接口

5

Can i use C# dapper to do something like this:

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

由于未实现默认无参构造函数,我现在无法这样做。

是否有什么技巧可以遵守SOLID原则(尤其是里式替换原则的精神),或者我应该将我的数据映射到Foo而不是IFoo接口?

我真的很担心要遵守这些SOLID原则,但仍然不知道在哪里应该这样做,所以寻求关于这种具体情况的建议。


3
将接口映射并不是很合理,Dapper怎样才能知道要使用哪种类型呢? - Ant P
变量可以是 IFoo,但你必须告诉 Dapper 具体的类型是什么。 - juharr
我不知道Dapper。但它绝对是有意义的。当您在NHibernate中查询接口时,它会查询实现该接口的所有映射实体。此外,还可以将接口映射为基类,例如。 - Stefan Steinegger
Dapper目前不会自动扫描抽象类型的具体实现;但是,如果您想要这样做,可以使用GetRowParser<T>(从IDataReader)执行非常相似的操作 - 但是您仍然需要手动告诉它具体类型。 - Marc Gravell
2个回答

10

您需要一个具体的类实现来实例化。在内部,它必须创建一个新对象。您不能创建接口的新实例:

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

您仍然可以将结果转换为接口,但需要一个具体类型从数据库中构建。

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

记录一下:我可以展示一些例子,其中"This won't build!"(这个无法构建!):(仍然使用IFoo作为接口)。但是,本质上来说:是的,这是正确的。Query<T>实际上返回一个IEnumerable<T>,但这只是一个小细节。 - Marc Gravell

1

一种组织存储库的方法是使用私有类对象进行查询,但将结果作为公共接口公开。

公共模型:

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;
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接