Can i use C# dapper to do something like this:
IFoo bar = _dbConnection.Query<IFoo>("My query there");
由于未实现默认无参构造函数,我现在无法这样做。
是否有什么技巧可以遵守SOLID原则(尤其是里式替换原则的精神),或者我应该将我的数据映射到Foo而不是IFoo接口?
我真的很担心要遵守这些SOLID原则,但仍然不知道在哪里应该这样做,所以寻求关于这种具体情况的建议。
您需要一个具体的类实现来实例化。在内部,它必须创建一个新对象。您不能创建接口的新实例:
var foo = new IFoo(); // This won't build!
您仍然可以将结果转换为接口,但需要一个具体类型从数据库中构建。
IEnumerable<IFoo> foo = _dbConnection.Query<Foo>("My query there");
IFoo
作为接口)。但是,本质上来说:是的,这是正确的。Query<T>
实际上返回一个IEnumerable<T>
,但这只是一个小细节。 - Marc Gravell一种组织存储库的方法是使用私有类对象进行查询,但将结果作为公共接口公开。
公共模型:
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;
}
}
}
IFoo
,但你必须告诉 Dapper 具体的类型是什么。 - juharrGetRowParser<T>
(从IDataReader
)执行非常相似的操作 - 但是您仍然需要手动告诉它具体类型。 - Marc Gravell