3

我正在尝试一个示例应用程序来测试依赖注入。在使用 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()”?

谢谢

4

3 回答 3

7

你从我认为的部分答案开始:'BookDTO 是一个数据传输对象'。因此,抽象它没有什么价值,因为它属于应用程序的一个非常特定的层。

BookDTO 的作用是作为一本书的纯数据表示(以某种可能的可序列化形式)。这将发生在您的应用程序堆栈的低级别。任何需要使用此类数据的代码都应该创建一个可以在代码中使用的域对象“Book”。这将书籍数据 (BookDTO) 的持久性和检索与其域表示 (Book) 分离。

我认为您的接口定义不符合此目的,因此 DI 在这里没有任何目的。我觉得 DI 在这里发挥作用的地方是 Book DTO 的检索。加载书籍数据的类将注入这样的服务并使用它来检索 BookDTO 实例。

于 2015-05-11T15:30:59.720 回答
0

好吧,任何实例化对象的人都需要知道创建它的实际类型。

看起来您需要的是某种存储库,它知道.IDTOBaseBookDTO. 您的应用程序会知道IDTOBase. 您的应用程序会发出类似 的调用BookRepo.GetBooks,其中您的存储库签名看起来像IQueryable<IDTOBase> GetBooks

于 2015-05-11T15:28:45.967 回答
0

您需要另一个可以为您解决依赖关系的类。

在 DI 的大多数情况下,您会说“给我一个‘类’并将它所具有的任何映射接口解析到它的映射类实例”,你需要的是那个‘类’。

我在学习 DI 时喜欢其中的一些示例。http://www.asp.net/web-api/overview/advanced/dependency-injection

于 2015-05-11T15:38:58.983 回答