gpt4 book ai didi

c# - 依赖注入(inject)和显式接口(interface)实现

转载 作者:太空狗 更新时间:2023-10-29 17:49:18 26 4
gpt4 key购买 nike

在依赖注入(inject)方面显式实现接口(interface)是否有好处?

据我了解,接口(interface)可以显式或隐式实现:

interface IFoo
{
void Bar();
}

//implicit implementation
class Foo1 : IFoo
{
public void Bar(){}
}

//explicit implementation
class Foo2 : IFoo
{
void IFoo.Bar(){}
}

现在显式实现只能通过调用接口(interface)方法来调用,而隐式实现可以直接在类的实例上调用:

class Baz
{
void Ba()
{
Foo1 foo1 = new Foo1();
foo1.Bar();

Foo2 foo2 = new Foo2();
foo2.Bar(); //syntax error

IFoo foo2_explicit = new Foo2();
foo2_explicit.Bar();
}
}

因此,使用显式接口(interface)实现,不能意外地调用具体类上的方法,但必须调用接口(interface)方法。这是否像 DI 的一个目的那样防止紧密耦合的代码,或者我在这里咆哮错误的树?毕竟,我们不能不小心编写一个构造函数或方法来注入(inject)具体类而不是接口(interface):

class Baz
{
void Ba(Foo2 foo)
{
foo.Bar(); //syntax error
}

void Bb(IFoo foo)
{
foo.Bar();
}
}

最佳答案

通常,依赖注入(inject)的目的是解耦,您可以通过将抽象注入(inject)其客户端来实现:

public class Baz
{
private readonly IFoo foo;

public Baz(IFoo foo)
{
this.foo = foo;
}

// Members using this.foo go here...
}

这确保 Baz 依赖于 IFoo,并且与任何具体实现分离

具体类是否隐式或显式实现 IFoo 没有区别。

偶尔,一个类可能有一个 Concrete Dependency , 但这不是特别正常;当它发生时,具体的依赖是具体的,所以通常根本不会实现接口(interface)。在这种情况下,显式与隐式接口(interface)实现无关紧要。

关于c# - 依赖注入(inject)和显式接口(interface)实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31674733/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com