我正在尝试一个示例应用程序来测试依赖注入。在使用DI之前,我在班上有以下方法:
public IQueryable<BookDTO> GetBooks()
{
var books = from b in db.Books
select new BookDTO()
{
Id = b.Id,
Title = b.Title,
AuthorName = b.Author.Name
};
return books;
}
BookDTO是另一个项目中定义的数据传输对象。现在我想把我的项目松散地结合在一起。所以我创建了IDTOBase接口并使BookDTO实现了这一点。我有一个统一容器,我已经将BookDTO类的相关注册到IDTOBase。
但是如何在原始方法中重写LINQ查询?什么取代“新BookDTO()”?
由于
答案 0 :(得分:7)
你从我认为的部分答案开始:'BookDTO是一个数据传输对象'。因此,抽象它几乎没有价值,因为它属于您应用程序的一个非常特定的层。
BookDTO的作用是作为一本书的纯数据表示(可能是一种可序列化的形式)。这将在应用程序堆栈中的低级别发生。任何需要使用此类数据的代码都应该创建一个可以在代码中使用的域对象“Book”。这将书籍数据(BookDTO)的持久性和检索与其域表示(Book)分离。
您的界面定义我不认为是出于此目的,所以DI在这里没有用处。我认为DI在这里发挥作用的是书籍DTO的检索。加载书籍数据的类将注入此类服务并使用它来检索BookDTO实例。
答案 1 :(得分:0)
那么,实例化对象的人将需要知道实际的类型。
您需要的是某种存储库,它知道IDTOBase
以及BookDTO
。您的应用程序会了解IDTOBase
。您的应用程序将调用BookRepo.GetBooks
之类的调用,其中您的存储库签名看起来像IQueryable<IDTOBase> GetBooks
。
答案 2 :(得分:0)
您需要另一个可以为您解决依赖关系的类。
在DI的大多数情况下,你说“给我一个'类'并解决它对映射类实例的所有映射接口”,你需要的是'类'。
我在学习DI时喜欢其中的一些例子。 http://www.asp.net/web-api/overview/advanced/dependency-injection