如何仅使用接口创建 class 的实例

How to create an instance of a class using only the interface

我有一个以客户端、库和接口作为中间层的应用程序。库中的 类 实现了 Interface.I 想要调用库而不必引用它。所以我不必这样做:

IInterface myClass = new Library.MyClass();

我猜一种方法是使用 Unity。还有别的办法吗?不知何故,界面的整个概念现在都消失了。

谢谢

有几种方法可以做到这一点。 一个,通过使用依赖倒置,正如你在 Unity 中展示的那样,另一个通过编写 class 工厂,最后,正如你提到的,更新 class 实例,这实际上不是很有帮助 :)

我个人的口味倾向于依赖倒置,其中 Structuremap 是我最喜欢的 IoC 容器。非常容易设置,也非常容易使用,但大多数 IoC 容器都有很好的文档记录。

你通常最终得到的东西是这样的:

IInterface myClass = myContainer.GetInstanceOf<IInterface>();

如果我是对的,该库不是第三方组件,您可以更改实现!?如果是这样,我建议使用 MEF。它是 .Net 框架的一部分,完全支持您想要的 - 从不一定引用的其他程序集中加载组件。

在您的库中,您必须声明 class 以在具有导出属性的应用中使用:

[Export(typeof(IInterface))] class MyClass : IInterface{ }

并且在您的客户端应用程序中,您可以导入组件:

[Import(typeof(IInterface))] public IInterface myClase;

最后您可以组合所有导入和导出:

var catalog = new AggregateCatalog();

// add assamby by type
catalog.Catalogs.Add(new AssemblyCatalog(typeof (AnyType).Assembly));

// add assembly by path
// this example adds all assembly in the current directory that ends with "Extension.dll".
catalog.Catalogs.Add(new DirectoryCatalog(@".", "*Extensions.dll"));
var container = new CompositionContainer(catalog);

// compose parts: MEF composes all imports and exports
container.ComposeParts(this);

通常使用Factory设计模式来完成。

public interface IMyInterface
{
}

public class A : IMyInterface
{
    internal A() // so, the user/developer won't be able to call "var a = new A()" outside of the scope of the assembly
    {
    }
}

public class B : IMyInterface
{
    internal B()
    {
    }
}

public static class MyFactory
{
    public static IMyInterface CreateA()
    {
        return new A();
    }

    public static IMyInterface CreateB()
    {
        return new B();
    }
}

用法:

static void Main()
{
    IMyInterface a = MyFactory.CreateA(); // instance of A
    IMyInterface b = MyFactory.CreateB(); // instance of B
}

如果您正在创建一个 API,您可以将 AB 的构造函数设置为内部,这样开发人员将无法创建它们的实例不使用工厂。

注意:您可以使用工厂来存储创建的实例,因此它将return同一个实例,而不是每次都创建一个新实例。