1

你能举例说明我什么时候应该向Ctor发送接口吗?假设我想强制一个类使用特定的行为?

4

4 回答 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 回答