访问接口方法而不引用类

假设我在一个名为“Interface”的项目中有这样的接口:

public interface TestInterface { string Operation(); } 

和实现它的类。 该类位于另一个项目“Class”中:

 public class TestClass : TestInterface { public TestClass() { } public string Operation() { return "This is an Operation"; } } 

我的客户做了类似这样的事情(这又是一个不同的项目“客户”):

 class Program { static void Main(string[] args) { TestInterface i = new TestClass(); i.Operation(); } } 

我的问题与这一行有关:

 TestInterface i = new TestClass(); 

通过添加这一行,我实际上被迫在我的“客户端”项目中添加对“接口”和“类”项目的引用。 所以为什么这么大惊小怪呢? 我不能直接引用“类”而不保持“接口”吗? 有没有办法只通过接口访问方法(没有引用实现类)? 我在这里错过了什么吗?

有没有办法只通过接口访问方法

就在这里。 您可以使用TestClass动态加载程序集而不引用它,通过Activator.CreateInstance创建其实例并将其Activator.CreateInstance为接口类型:

 var assembly = Assembly.Load(...); var typeFromAssembly = assembly.GetTypes()...; var myInterfaceVar = (TestInterface)Activator.CreateInstance(typeFromAssembly); 

……或者……你可以使用现有的DI框架之一(例如MEF)并以更正确的方式做同样的事情:

 [Import] private TestInterface myInterfaceField; 

要么:

 var myInterfaceVar = compositionContainer.GetExportedValue(); 

根据您的喜好,您可能会提出更具体的问题。

在那个特定的样本中,没有任何优势。

但想象一个方法:

 public void Foo(ITestInterface handler) { handler.Operation(); } 

现在, Foo仅在接口上运行,并不关心具体类实现此接口。 您现在可以使用TestClass2实例或TestClass2调用Foo ,它可以在不同的程序集中定义。

您可以通过使用IOC实现您所描述的行为。 Unity是一个dependency injection容器,它允许在不手动创建实例的情况下创建实例。

例如,如果您要将您的类和接口注册为unity,则可以直接使用该接口;

 TestInterface i = Container.Resolve(); 

为了使您的代码完全独立于TestInterface实现,请使用Dependency Inversion 。 这可以通过一些dependency injection框架来实现。

例如,使用Unity,您可以通过xml配置实现

  

您的代码将仅依赖于Unity(不参考实现):

 TestInterface i = Container.Resolve(); 

你有接口,以便你的应用程序可以plug in's ..

所以基本上你将界面dll 分享给想要为你的应用程序制作插件应用程序的任何人,然后你可以将新的插件类转换为接口并调用它上面的方法。

如果您不将类强制转换为界面,那么您将如何使插件类适用于您的应用程序..