【问题标题】:How to use Simple injector for repository in business layer如何在业务层使用简单的注入器进行存储库
【发布时间】:2014-01-03 03:11:00
【问题描述】:

我希望在我的 MVC 层中根本没有存储库。

我的 DAL 项目层中有通用的 EFRepositoryIRepositoryPASContext(继承自 DbContext)。

我已经在我的 MVC 项目下安装了具有快速启动功能的 Simple Injector,这使我可以在每个控制器的构造函数中获取我想要的存储库。

但在我的解决方案中,我也有 BLL 项目,我希望 MVC 层只与 BLL 层对话,因为这是项目架构,将来我想在 BLL 层内的类中添加逻辑。

我也不想在我的 BLL 层中创建上下文,但存储库没有构造函数,它接受 0 个参数,这是我的 ProductBLL 类:

public class BLLProducts
{
    IRepository<Product> ProductRepository;

    public BLLProducts(EFRepository<Product> Repository)
    {
        ProductRepository = Repository;
    }

    public ICollection<Product> getAll()
    {
        return ProductRepository.All().ToList();
    }
}

如何在不创建存储库/上下文的情况下从控制器或 unitTest 启动 BLLProduct 类?所以我可以在这里保持我的抽象。

我知道我需要在这里以某种方式使用简单注射器,我只是不知道如何。

【问题讨论】:

    标签: c# asp.net-mvc repository simple-injector business-layer


    【解决方案1】:

    从控制器的角度来看,只需将BLLProducts 注入其中即可,如下所示:

    // constructor
    public HomeController(BLLProducts products) {
        this.products = products;
    }
    

    从单元测试的角度来看,让控制器依赖于具体的类是次优的(它违反了Dependency Inversion Principle)。这是次优的,因为您现在需要创建一个 BLLProducts 实例并使用 DbContext 对其进行实例化,但此 DbContext 特定于实体框架,它依赖于数据库。这使测试变得更加困难和缓慢。您希望您的单元测试在没有数据库的情况下运行。

    所以解决这个问题的方法是将这个BLLProducts 类隐藏在一个抽象后面。一个简单的方法是从这个类中提取一个接口:

    public interface IBLLProducts {
        ICollection<Product> getAll();
    }
    

    这使得对控制器进行单元测试变得更加容易。你唯一要做的就是让它依赖于这个新界面:

    public HomeController(IBLLProducts products) {
        this.products = products;
    }
    

    您需要在 Simple Injector 中注册这个IBLLProducts 接口:

    container.Register<IBBLProducts, BLLProducts>();
    

    整个模型仍有一些缺点。例如,虽然 Simple Injector 可以为您创建和处置 DbContext,但您在哪里调用 SubmitChanges?当网络请求结束时这样做是一个非常糟糕的主意。我为此找到的唯一方便的解决方案是迁移到更可靠的架构。例如,看看this question

    【讨论】:

    • 非常感谢!您会向我推荐哪种 SOLID 架构接近我当前的架构? (BLL 正在通过存储库与 DAL 交谈,MVC 正在使用简单的 Injector 与 BLL 交谈)
    • @jony89:研究 5 个 SOLID 原则。它们为您提供比不同架构风格(例如 3 层架构)更重要的指导。对抽象进行编程,限制类的职责,并防止在添加功能时更改类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多