IoC在复杂的环境中

时间:2009-11-11 15:33:52

标签: inversion-of-control

情况如下:

ICategorized使用

ICategoryService来管理类别。

public interface ICategorized
{
    ICategory Category { get; set; }
}

然后一些类实现ICategorized

public class Cart : ICategorized
{
    ...
    ICategory Category { 
        get {
             return _categoryService.GetItemCategory(...)
        }
        set {
             _categoryService.SetCategoryForItem(...);
        };

    }

    ...
}

那么,设置_categoryService实施的最佳解决方案是什么? 通过构造函数或属性注入?

使用构造函数可能会导致非常复杂的构造函数,如

public class Cart : ICategorized. ITagged, ISecured, IMediaSupport {
    public Cart(ICategoryService cs, ITagService ts, ISecurityService ss, IMediaService ms) {...}

    ...
}

我怀疑这是一个好设计。有什么想法吗?


你的建议是什么? 我可以赋予Cartateg责任ICategoryService但在这种情况下我不能使用Lazy加载。像

这样的东西
public class CartService : ICartService {
public CartService(ICategoryService cs) {...}

...

}

1 个答案:

答案 0 :(得分:4)

我更喜欢构造函数注入而不是属性注入,主要是因为它明确了组件所需的服务。如果使用IoC容器,则不必担心构造函数变得过于复杂,因为您永远不必使用构造函数,只有容器才能使用。

物业注入可用于非必需服务。

顺便说一下;一般来说,非常长的构造函数签名可能意味着您的类不遵守单一责任原则,也许它应该重构为两个或更多单独的类。