访问接口方法而不引用类
假设我在一个名为“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 分享给想要为你的应用程序制作插件应用程序的任何人,然后你可以将新的插件类转换为接口并调用它上面的方法。
如果您不将类强制转换为界面,那么您将如何使插件类适用于您的应用程序..