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

时间:2016-05-13 06:10:12

标签: c# interface n-tier-architecture

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

IInterface myClass = new Library.MyClass();

一种方法是使用Unity我猜。还有其他方法吗?不知怎的,接口的整个想法现在消失了。

由于

3 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点。 一,通过使用依赖倒置,如你在Unity中展示,另一个通过编写类工厂,最后,如你所提到的,新建类实例,这根本不是真的有用:) / p>

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

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

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

答案 1 :(得分:1)

如果我是对的,那么该库不是第三方组件,您可以更改实施!?如果是这样,我建议使用MEF。它是.Net框架的一部分,并且完全支持您所需的内容 - 从其他未必引用的程序集中加载组件。

在您的库中,您必须使用导出属性声明要在您的应用中使用的类:

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

答案 2 :(得分:1)

通常使用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的构造函数设置为internal,这样开发人员就无法在不使用Factory的情况下创建它们的实例。 / p>

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