访问接口方法,而没有提到的类(Access interface methods without re

2019-08-08 02:37发布

说我有一个名为“接口”项目这样的界面:

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();

通过加入这一行,我其实是被迫的引用从我的“客户”的项目添加到这两个“接口”以及“类”项目。 那么,为什么这些麻烦? 我不能直接引用到“类”之间没有保持“接口”? 有没有什么办法来访问仅通过接口中的方法(不做任何参考实现类)? 我失去了一些东西在这里?

Answer 1:

有没有什么办法来访问通过界面上的唯一方法

就在这里。 您可以动态加载与程序集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>();

根据你喜欢的方式,你可能会问更多的具体问题。



Answer 2:

在这种特定的样品,没有任何优势。

但是想象一下,一个方法:

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

现在, Foo只是在界面上进行操作,它并不关心具体的类实现此接口。 现在,您可以调用Foo与实例TestClassTestClass2 ,这可能会在不同的组件进行定义。



Answer 3:

就可以实现您通过使用国际奥委会所描述的行为。 团结是一个依赖注入容器,其允许,而无需手动创建实例来创建实例。

举例来说,如果你要你的类和接口的注册单位,你会直接使用界面;

TestInterface i = Container.Resolve<TestInterface>();


Answer 4:

为了使您的代码完全独立于实现TestInterface使用依赖倒置 。 这可以通过一些依赖注入框架来实现。

例如,用团结 ,可以配置XML实现

<register type="TestInterface" 
          mapTo="Foo.Bar.TestClass, Foo.Bar" />

而你的代码将在统一(实施的引用)仅取决于:

TestInterface i = Container.Resolve<TestInterface>();


Answer 5:

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

所以基本上你分享你的DLL接口给任何人谁愿意做你的应用程序插件的应用程序,然后你可以施放新的插件类的接口和调用方法就可以了..

如果你不投的类接口,你打算如何在地球上,让你的应用程序插件类的工作..



文章来源: Access interface methods without referring the class