我有一个应用程序,客户端,Library和Interface作为中间层。库中的类实现了Interface.I想要调用库而不必引用它。所以我不必这样做:
IInterface myClass = new Library.MyClass();
一种方法是使用Unity我猜。还有其他方法吗?不知怎的,接口的整个想法现在消失了。
由于
答案 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,可以将A
和B
的构造函数设置为internal,这样开发人员就无法在不使用Factory的情况下创建它们的实例。 / p>
注意:您可以使用工厂存储创建的实例,因此它将返回相同的实例,而不是每次都创建一个新实例。