转换为IoC,如何处理内部对象

时间:2013-04-26 16:07:34

标签: c# inversion-of-control onion-architecture

我在这里查看了很多线程(也许我使用了错误的术语),但我正在将Web应用程序转换为通过NInject使用IoC。我的其他IoC项目相当小,所以这不是一个大问题,但对于以下情况,推荐的做法是什么......

我的对象的结构看起来像这样......

public class Address
{
    public virtual string Street { get; set; }
    public virtual City City { get; set; }
}

城市是它自己的对象......

public class City
{
    public virtual string Name { get; set; }
}

现在我一直在处理不可避免的“Object is null”异常,如下所示......

public void DoThing()
{
    new Address address();
    address.Street = _street;
    address.City = new City();
    address.City.Name = _cityName;
    DoOtherThing(address);
}

对于较小的项目来说这很好......但是现在我们正在谈论更大的事情,它变成了一件真正的苦差事。 (向我的对象添加另一个对象,这可能意味着我需要在100多个地方执行此操作,假设我找到了所有这些对象)

在IoC之前,这样做很容易处理......

public class Address
{
    private string street;
    private City city;

    public Address()
    {
        street = string.Empty;
        City = new City();
    }

    public string Street 
    { 
        get { return street; } 
        set { street = value; }
    }
}

我想弄清楚(也许我只是完全忽略了我读过的指南中的这个细节),我怎样才能以优雅的方式在IoC中做同等的事情呢?

我所遵循的结构基于Tony Sneed在http://www.develop.com/onionarchitecture提出的结构

唯一值得注意的区别是我的服务级别没有任何东西,因为我们的大多数东西只是读取/写入数据库,中间几乎没有明显的操作。 (我可能会有一些我需要在服务级别上放置的东西,但是还没有打到任何东西,仍然不完全清楚属于那个级别的什么属于存储库。)

让我知道是否有更多细节我可以提供帮助(IoC工作正常,我只需解决上述问题以保持可维护性合理)

1 个答案:

答案 0 :(得分:2)

如果您所做的只是创建一个空对象,那么没有真正的理由使用IoC(一个更好的术语是依赖注入,因为它更具体)。除非您要将加载的City对象传递给Address对象,否则只需在构造函数中使用new即可。在这种情况下使用IoC / DI没有任何好处。

当您需要在运行时将依赖项传递给对象时,应该使用DI。虽然这在技术上是一种依赖,但它是一个简单的空对象这一事实并不能使它成为一个好的候选对象。