我正在尝试使用样本应用来测试依赖项注入。在使用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查询?什么将取代" new Bookdto()"?
谢谢
您从我认为的部分答案开始:'bookdto是数据传输对象'。因此,由于它属于您的应用程序的非常特定的层,因此将其抽象几乎没有价值。
bookdto的作用是纯粹的数据表示(以某些可能序列化的形式)。这将在您的应用程序堆栈中以低级别发生。任何需要使用此类数据的代码都应创建一个可以在代码中使用的域对象"书"。这将书籍数据(bookdto)的持久性和检索与其域表示(书)脱在一起。
您的界面定义我认为无法实现此目的,因此DI在这里没有目的。我觉得DI在这里发挥作用的地方是Book DTO的检索。加载书籍数据的类将具有这样的服务并使用它来检索BookDTO实例。
好吧,任何实例化对象的人都需要知道要制作的实际类型。
您需要的是某种存储库,它知道IDTOBase
以及BookDTO
。您的应用程序将了解IDTOBase
。您的应用程序将拨打像BookRepo.GetBooks
这样的呼叫,其中存储库签名看起来像IQueryable<IDTOBase> GetBooks
。
您需要另一个可以解决依赖关系的类。
在大多数情况下,您会说"给我一个'类',然后解决其与其映射的类实例的任何映射接口" ",您需要的是'class'。
当我学习di时,我喜欢其中一些示例。http://www.asp.net/web-api/overview/advanced/depperency-injoction