你能举例说明我什么时候应该向Ctor发送接口吗?假设我想强制一个类使用特定的行为?
问问题
95 次
4 回答
5
将接口传递给构造函数的原因与将接口传递给任何方法的原因相同。例如,如果您的构造函数采用对象列表,则您可以接受 IList 而不是 List。这就是说构造函数接受任何看起来和行为都像列表的选项,而不是需要实际的列表,使其更通用。
于 2012-09-01T13:52:17.930 回答
2
这种行为通常在装饰器模式的上下文中看到,当您希望能够通过在创建时(或以后)传递不同的“装饰器”作为参数来更改类的不同实例的行为时。例子:
interface ISerializer
{
void Serialize(object obj);
}
class BinarySerializer : ISerializer
{
public void Serialize(object obj)
{
// serialize obj as binary stream
}
}
class XMLSerializer : ISerializer
{
public void Serialize(object obj)
{
// serialize obj as XML
}
}
// ...
class PersistanceManager
{
private ISerializer serializer;
public PersistanceManager(ISerializer serializer)
{
this.serializer = serializer;
}
public void Persist(object[] objects)
{
foreach(object obj in objects)
{
serializer.Serialize(obj);
}
}
}
现在我可以在运行时注入不同的行为:
PersistanceManager manager1 = new PersistanceManager(new BinarySerializer());
PersistanceManager manager2 = new PersistanceManager(new XMLSerializer());
于 2012-09-01T13:56:48.827 回答
2
我认为你真正想问和做的是'为什么我会有一个构造函数来获取一个实现特定接口的对象'。
此行为允许您将inject
不同类型的对象放入即将创建的对象中。例如,您可以轻松更改将要写入数据的位置(文件、网络、数据库)。
注入与依赖注入模式有关
于 2012-09-01T13:58:21.783 回答
1
如果您想将您的依赖项与您的类分开,您可以这样做。如果自定义类中的另一个类不是创建实例,而是通过接口从自定义类外部注入该依赖项。
这种依赖注入可以通过您自己编写的自定义咖啡来完成,也可以使用依赖容器。.NET 世界中一些流行的方法是 Unity、Ninject 或 Autofac。
于 2012-09-01T13:57:25.173 回答