在不引用类的情况下访问接口方法
本文关键字:访问 接口 方法 情况下 引用 | 更新日期: 2023-09-27 17:56:02
假设我在一个名为"Interface"的项目中有这样的接口:
public interface TestInterface
{
string Operation();
}
和实现它的类。此类位于另一个项目"类"中:
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
创建其实例并将其转换为接口类型:
var assembly = Assembly.Load(...);
var typeFromAssembly = assembly.GetTypes()...;
var myInterfaceVar = (TestInterface)Activator.CreateInstance(typeFromAssembly);
。或。。。您可以使用现有的 DI 框架之一(例如 MEF)并以更正确的方式做同样的事情:
[Import]
private TestInterface myInterfaceField;
或:
var myInterfaceVar = compositionContainer.GetExportedValue<TestInterface>();
根据您喜欢的方式,您可能会提出更具体的问题。
在该特定示例中,没有优势。
但是想象一种方法:
public void Foo(ITestInterface handler)
{
handler.Operation();
}
现在,Foo
只在接口上运行,它不关心什么具体类实现这个接口。您现在可以使用 TestClass
的实例或 TestClass2
调用 Foo
,这些实例可以在不同的程序集中定义。
使用 IOC 实现您所描述的行为。Unity 是一个依赖注入容器,允许在不手动创建实例的情况下创建实例。
例如,如果要将类和接口注册到 unity,您将直接使用该接口;
TestInterface i = Container.Resolve<TestInterface>();
要使代码完全独立于TestInterface
的实现,请使用依赖关系反转。这可以通过一些依赖注入框架来实现。
例如,使用 Unity,您可以通过 xml 配置实现
<register type="TestInterface"
mapTo="Foo.Bar.TestClass, Foo.Bar" />
您的代码将仅依赖于 Unity(不引用实现):
TestInterface i = Container.Resolve<TestInterface>();
你有接口,所以你的应用程序可以有plug in's
..
所以基本上你把你的接口dll分享给任何想要为你的应用程序制作插件应用程序的人,然后你可以将新的插件类强制转换为接口并在其上调用方法。
如果你不把类强制转换为接口,你到底要如何让插件类为你的应用程序工作。