返回对象的控制反转

时间:2009-08-10 19:53:28

标签: c# inversion-of-control

我有一个返回ISomething的方法。我试图在整个程序中使用Inversion of Control ...但我不知道如何在返回值时执行它 - 我无法将其传递给方法,或者在构造它时将其传递给对象,因为这种方法应该创建对象。

我看到的唯一解决方案是在构造对象时将ISomething工厂(Func<ISomething>)传递给对象。这是通常/正确的解决方案还是推荐的其他方法?

[编辑]很奇怪 - 没有其他人有这个问题?我的意思是,没有向上(甚至是向下)投票......

[编辑]更多细节:该方法应该将IExcel导入ITable。下面的共识似乎是我应该将此方法视为转换器,将IExcel转换为ITable,从而接收两者作为参数而不是返回ITable值。如果没有新内容出现的话,我会再把这个问题留一天,然后再做其中一个回复。

3 个答案:

答案 0 :(得分:2)

你的方法应该构建ISomething,还是设置它的状态并返回状态初始化的ISomething? (或者这需要一次操作吗?)

如果你的类有一个负责创建ISomething的方法,那么 是一个ISomethingFactory(除非你有混合的顾虑)。在这种情况下,它有逻辑选择正确的ISomething实现并创建它,所以你不必过分担心IoC方面。

但是,如果这个类关注创建适当的ISomething,那么我可能会通过一个工厂。问题是,在大多数情况下,你的DI容器应该能够执行此操作你(打电话到工厂去获得适当的ISomething),所以看到一个必须创建一个不是工厂的ISomething的方法会让我感到紧张。

在这样的论坛中尝试提供建筑指导总是很难 - 但是由于输入有限,我要么说你有一个你不知道的工厂,或者你有问题。< / p>

答案 1 :(得分:1)

“我有一个对象需要创建一个对象并用它做一些事情,但我不希望该对象知道正在创建什么类型的对象,除了它应该是某个接口。”< / p>

这听起来几乎就像抽象工厂模式的教科书描述,这表明你的对象依赖于合适的工厂。

其中还整齐地分配了职责 - 一个对象负责创建适当类型的对象,而另一个负责在返回之前对其执行操作。

答案 2 :(得分:0)

在包含返回ISomething的方法的对象的构造函数中,获取IoC容器的实例。然后,实例化ISomething的方法可以使用IoC容器来获取正确类型的对象。

即:

public class ExcelImporter
{
    private IObjectFactory ObjectFactory { get; set; }

    public ExcelImporter(IObjectFactory objectFactory)
    {
        ObjectFactory = objectFactory;
    }

    public ITable Import()
    {
        var result = ObjectFactory.Get<ITable>();
        { Do import here }
        return result;
    }
}