首页 > 解决方案 > 如果调用某些构造函数而不是向类传递不必要的参数,则阻止对方法的访问?

问题描述

我有一个包含 2 个单独方法的类:RunFetch. run 方法遍历对象的每个小部件并调用小部件的Execute函数。每个小部件都是独立的,并进行自己的数据调用。

但是,还有另一种方法,Fetch它通过逻辑层访问数据库以使用数据填充小部件。这两种方法在完全不同的时间和应用程序的不同点被调用。

当我们调用该run方法时,我们不需要将上下文传递给主对象,但我们确实需要上下文来获取数据。在这种情况下,最佳实践是什么?有一个即使不需要上下文也总是需要上下文的构造函数,或者有多个构造函数并在调用方法时抛出异常而没有填充上下文?

标签: c#entity-framework

解决方案


与其尝试基于多个构造函数并根据您使用的 IoC 容器来阻止调用,不如探索惰性依赖项的使用。例如 Autofac 支持延迟初始化。这使得依赖关系(启动起来可能相当昂贵)仅在需要时才被解决。

我广泛使用它们来简化我的单元测试场景。

private MyDbContext _myDbContext = null;
private readonly Lazy<MyDbContext> _lazyMyDbContext = null;
public MyDbContext MyDbContext
{
    get { return _myDbContext ?? _lazyMyDbContext?.Value ?? throw new DependencyNullException("MyDbContext"); }
    set { _myDbContext = value; }
}

public MyClass(Lazy<MyDbContext> myDbContext = null)
{
   _lazyMyDbContext = myDbContext;
}

以上是对测试更友好的实现。DependencyNullException 是类似于 ArgumentNullException 的自定义异常。(有利于找到在某处引发的 NullReferenceException)您可以将其归结为:

private readonly Lazy<MyDbContext> _lazyMyDbContext = null;
private MyDbContext MyDbContext
{
    get{ return _lazyMyDbContext?.Value ?? throw new DependencyNullException("MyDbContext");
}
public MyClass(Lazy<MyDbContext> myDbContext)
{
   _lazyMyDbContext = myDbContext;
}

这确保了依赖项根据需要启动,但也简化了可能具有多个依赖项的类的单元测试,因为测试不需要模拟每个依赖项来满足构造函数,只需通过属性设置器初始化和设置所需的模拟在执行场景之前。


推荐阅读