依赖是另一个对象所依赖的一个对象。依赖注入(或反转)基本上是提供对象所需的对象,而不是让它自己构造对象。这是一种有用的技术,可以使测试变得更容易,因为它允许您模拟依赖关系。
例如,如果类 a 调用类 b 上的方法,而类 b 又调用类 c 上的方法,则意味着a依赖于b,b依赖于c。使用依赖注入,我们可以将类c的实例传递给类b,并将b的实例传递给类a,而不是让这些类构造b和c的实例.
在下面的示例中,类 runner 依赖于类 logger。请注意,在类 runner 的构造函数中创建了 logger 的实例。这段代码有一些问题。
这将记录器类与 runner 联系在一起,我们不能用其他类替换它,无需修改runner。
如果logger有任何依赖项,那么worker必须先配置它们实例化 logger。
测试更加困难。如果logger是资源密集型类,比如访问网络或文件系统,它会减慢测试速度。我们无法轻易更换它。
using system;class program{ static void main(string[] args){ var runner = new runner(); runner.run(); }}class runner{ private logger _logger; public runner(){ _logger = new logger(); } public void run(){ // do some work _logger.log("message to be logged"); }}class logger{ public void log(string message){ console.writeline(message); }}
使用依赖注入,我们修改 runner 的构造函数以接受接口 ilogger,而不是具体对象。我们更改 logger 类来实现 ilogger。这允许我们将 logger 类的实例传递给 runner 的构造函数。这样做的好处是,在测试期间,我们可以创建一个实现 ilogger 的 testlogger 类,并将其传递给 runner 的构造函数。
示例 实时演示
using system;class program{ static void main(string[] args){ var logger = new logger(); var runner = new runner(logger); runner.run(); }}class runner{ private ilogger _logger; public runner(ilogger logger){ _logger = logger; } public void run(){ // do some work _logger.log("message to be logged"); }}interface ilogger{ void log(string message);}class logger : ilogger{ public void log(string message){ console.writeline(message); }}
输出message to be logged
以上就是解释c#中的依赖注入的详细内容。