c# - 如果调用某些构造函数而不是向类传递不必要的参数,则阻止对方法的访问?
问题描述
我有一个包含 2 个单独方法的类:Run
和Fetch
. run 方法遍历对象的每个小部件并调用小部件的Execute
函数。每个小部件都是独立的,并进行自己的数据调用。
但是,还有另一种方法,Fetch
它通过逻辑层访问数据库以使用数据填充小部件。这两种方法在完全不同的时间和应用程序的不同点被调用。
当我们调用该run
方法时,我们不需要将上下文传递给主对象,但我们确实需要上下文来获取数据。在这种情况下,最佳实践是什么?有一个即使不需要上下文也总是需要上下文的构造函数,或者有多个构造函数并在调用方法时抛出异常而没有填充上下文?
解决方案
与其尝试基于多个构造函数并根据您使用的 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;
}
这确保了依赖项根据需要启动,但也简化了可能具有多个依赖项的类的单元测试,因为测试不需要模拟每个依赖项来满足构造函数,只需通过属性设置器初始化和设置所需的模拟在执行场景之前。
推荐阅读
- python - 应用时移
- vba - MS Access 无法识别 Office 16 文件扩展名
- python - 如何使用 matplotlib 使用自定义绘图功能创建子图的子图
- google-chrome-devtools - 有没有办法强制 Uncaught Cannot tween 空目标提供行号或堆栈跟踪?
- javascript - 如何将json对象转换为日期?
- testing - Python 测试发现因 remote.ssh + conda env 而失败
- excel - 如何返回没有字母的正则表达式匹配
- java - 考虑到夏令时,如何在 mongoDB 中存储用于调度的未来日期
- r - 将不同的函数列表传递给 dplyr 总结
- javascript - 使用在导出函数中定义的函数,来自另一个文件