我可以在这里利用依赖注入吗?

时间:2010-06-22 20:05:34

标签: c# dependency-injection unity-container

我正在开发一个使用MS Application Blocks的项目。我看到'Unity'dll可供我使用。顺便说一句,这是1.1版本。我如何在这里使用依赖注入?

我有一个班级

public class ScheduleDataDetailsDC
{
    public int ScheduleID;
    public List<ScheduleRateLineItem> MinRateList;
    public List<ScheduleRateLineItem> MaxRateList;
    public List<ScheduleRateLineItem> VotRateList;
    public List<ScheduleLOSRateDC> LosRateList;
    public List<ScheduleRateParamsDC> RateParams;
}

所以当我新建的时候,我正在做这个......

    new ScheduleDataDetailsDC{
                    LosRateList = new List<ScheduleLOSRateDC>()
                    , MaxRateList = new List<ScheduleRateLineItemDC>()
                    , MinRateList = new List<ScheduleRateLineItemDC>()
                    , RateParams = new List<ScheduleRateParamsDC>()
                    , VotRateList = new List<ScheduleRateLineItemDC>()
                }

Unity 1.1可以帮助我吗?我希望能够使用var x = new ScheduleDetailsDC(),并为我初始化这5个内部列表。 Unity可以为我做点什么吗?请注意我以前从未使用过DI。

感谢您的任何指示, 〜在圣地亚哥

3 个答案:

答案 0 :(得分:2)

最好的办法是初始化构造函数中的列表,并通过将它们转换为属性来拒绝从其他类直接访问它们:

public class ScheduleDataDetailsDC
{
    public ScheduleDataDetailsDC()
    {
        this.MinRateList = new List<ScheduleRateLineItem>();
        //inialise other lists
    }

    public List<ScheduleRateLineItem> MinRateList { get; private set; }
    ...
}

似乎依赖注入在这里并不真正有用,因为类似乎是一个简单的数据容器,尽管没有更多的上下文很难判断。

答案 1 :(得分:0)

是Unity 可以帮助您,但我认为情况并非如此。您可以初始化列表,包括您的对象,为它们提供默认实例,Unity,因为任何其他IoC容器都不应该用作简单的对象构建器(尽管它可以)。

答案 2 :(得分:0)

我不确定Unity的1.1版本的细节是什么,但一般来说,无论何时使用Inversion of Control Container,都必须执行以下步骤:

  1. 注册您的IoC容器(在您的情况下为Unity)知道的类型。这包括您计划请求的所有主要类型以及所有依赖类型。在您的情况下,您需要让它知道ScheduleDataDetailsDC,以及确切需要进入每个被视为依赖项的列表
  2. 您的类型应将所有必需的依赖项指定为构造函数参数。这就是IoC Container将要确定需要注入的内容。如果你有可选的依赖项,那么你可以使用Property Injection来支持它(如果你的IoC容器支持它,我认为Unity会这样做)
  3. 您必须从容器中请求注册类型的实例。你究竟是怎么做的取决于你的容器。应该有Get<T>()Resolve<T>等方法。通常,您将要求“最高级别”类的实例,即在软件入口点附近使用的类。如果你这样做,并且已经为所有依赖类应用了依赖注入(并且你已经正确地注册了所有依赖类型),你应该得到一个提供了所有依赖项的对象,同样所有的对象依赖项。应该提供,并在线上。
  4. 由于您可以将具体类型绑定到接口类型,然后将该接口指定为依赖项,因此您也倾向于将接口与IoC结合使用。这允许您在绑定过程中应用业务规则和配置值,这使您能够在需要执行此类操作的情况下使用不同的具体实现。

    所以考虑到所有这一切,很难确切地说明在上面概述的情况下使用Unity会涉及到什么。首先,您需要注册ScheduleDataDetailsDC,但为了获得依赖关系,您还需要注册每个List类型,或者更具体地说,每个列表中的每个具体对象(当然,所有这些类的依赖关系)。由于我不确定这些列表的作用是什么,所以我很难说你如何去做(或者即使你可以这样做)。