如何仅使用接口创建 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,您可以将 A
和 B
的构造函数设置为内部,这样开发人员将无法创建它们的实例不使用工厂。
注意:您可以使用工厂来存储创建的实例,因此它将return同一个实例,而不是每次都创建一个新实例。
我有一个以客户端、库和接口作为中间层的应用程序。库中的 类 实现了 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,您可以将 A
和 B
的构造函数设置为内部,这样开发人员将无法创建它们的实例不使用工厂。
注意:您可以使用工厂来存储创建的实例,因此它将return同一个实例,而不是每次都创建一个新实例。