说我有一个名为“接口”项目这样的界面:
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
只是在界面上进行操作,它并不关心具体的类实现此接口。 现在,您可以调用Foo
与实例TestClass
或TestClass2
,这可能会在不同的组件进行定义。
就可以实现您通过使用国际奥委会所描述的行为。 团结是一个依赖注入容器,其允许,而无需手动创建实例来创建实例。
举例来说,如果你要你的类和接口的注册单位,你会直接使用界面;
TestInterface i = Container.Resolve<TestInterface>();
为了使您的代码完全独立于实现TestInterface
使用依赖倒置 。 这可以通过一些依赖注入框架来实现。
例如,用团结 ,可以配置XML实现
<register type="TestInterface"
mapTo="Foo.Bar.TestClass, Foo.Bar" />
而你的代码将在统一(实施的引用)仅取决于:
TestInterface i = Container.Resolve<TestInterface>();
你有接口,使您的应用程序可以plug in's
..
所以基本上你分享你的DLL接口给任何人谁愿意做你的应用程序插件的应用程序,然后你可以施放新的插件类的接口和调用方法就可以了..
如果你不投的类接口,你打算如何在地球上,让你的应用程序插件类的工作..