c# - 依赖注入(inject)的实现

标签 c# dependency-injection repository unity-container asp.net-web-api

我正在从事 Web API 项目。我正在调用一个负责数据库交互的存储库。存储库与第三方数据源交互。

我想在存储层中实现依赖注入(inject)(DI)来注入(inject)第三方数据源的依赖,但由于第三方DLL中没有接口(interface),我该如何实现呢?

我使用的是 Unity 框架。

第三方 DLL 只包含一个类:

using System;
using System.Collections.Generic;

namespace MoviesLibrary
{
    public class MovieDataSource
    {
        public MovieDataSource();
        public int Create(MovieData movie);
        public List<MovieData> GetAllData();
        public MovieData GetDataById(int id);
        public void Update(MovieData movie);
    }
}

最佳答案

这个第 3 方组件与存储库有何关系?它是存储库内部使用的独立服务吗?如果是这样,听起来 3rd 方组件本身是另一个应该抽象的依赖项。

您可以通过创建您自己的界面来实现这一点,该界面反射(reflect)您打算执行的业务操作,以及该服务将实现的业务操作。它可能与服务实现完全匹配,但不需要:

public interface IMovieService
{
    int Create(MovieData movie);
    List<MovieData> GetAllData();
    MovieData GetDataById(int id);
    void Update(MovieData movie);
}

然后你可以抽象出这个接口(interface)实现背后的依赖:

public class MovieService : IMovieService
{
    private MovieDataSource dataSource = new MovieDataSource();

    // methods simply delegate to the dataSource object
}

现在您有了一个可用于依赖项注入(inject)的接口(interface),当您想在不依赖第 3 方组件的情况下测试存储库时,您可以模拟该接口(interface)进行测试。

关于c# - 依赖注入(inject)的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25767889/

相关文章:

javascript - 使用 Angular1+ ES6 时, Controller 函数中的依赖注入(inject)未定义, Controller 作为类

c# - 将 TimeSpan 数据类型转换为 DateTime?

c# - Lucene 3.0.3 中的地理空间搜索 - API 重大更改?

c# - 考虑到透明度,如何检索与其他控件重叠的 WPF 控件的可见区域?

c# - 如何使用 Ninject 泛型将接口(interface)绑定(bind)到类?

c# - Git 存储库中不应包含哪些内容?

c# - 过度使用 switch 语句开销

configuration - Lua:我可以使用 "require"作为依赖注入(inject)的一种形式吗?

git - 当 git 子模块引用的 repo 被删除时会发生什么?

git - origin/, remotes/origin/Git 困惑