【问题标题】:Implementation of Dependency injection依赖注入的实现
【发布时间】:2015-04-17 08:31:12
【问题描述】:

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

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

我使用 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);
    }
}

【问题讨论】:

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


    【解决方案1】:

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

    您可以通过创建自己的接口来实现这一点,该接口反映您打算执行的业务操作,并且该服务将实现该接口。它可能完全匹配服务实现,但不需要:

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

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

    public class MovieService : IMovieService
    {
        private MovieDataSource dataSource = new MovieDataSource();
    
        // methods simply delegate to the dataSource object
    }
    

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

    【讨论】:

    • 我有点困惑。我对 DI 和存储库没有扎实的知识。我不明白这一行 - 这个第 3 方组件与存储库有什么关系?它是存储库内部使用的独立服务吗?我使用的层(webapi->repository->External DLL)不合适?
    • @little:如果第 3 方组件存储库实现,那么它可能根本不需要注入/模拟。我以为你有一个数据库存储库,它只需要一个单独的服务组件作为依赖项来使用它的某些功能。但是如果整个存储库只是委托给第 3 方组件,那么实际上没有什么可以进行单元测试,只有集成测试,所以不需要注入它。
    • 谢谢大卫,只是一个小问题,我可以在 webapi 和外部数据源层之间使用存储库吗?
    • @little:我不确定你的意思。您是否在问是否可以使用存储库模式来抽象数据源?是的,你绝对可以做到。您是否在问是否可以与其他应用程序共享该实现?再次,是的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 2023-03-14
    • 2014-01-08
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    相关资源
    最近更新 更多