【问题标题】:n-tier design - best way to pass data retrieving objectn 层设计 - 传递数据检索对象的最佳方式
【发布时间】:2009-08-27 00:47:51
【问题描述】:

我使用的是基本的 3 层设计。出于灵活性(和测试)的目的,我希望数据层是抽象的,并在我的代码中指定具体的类。但是,我应该如何将它传递给我的业务对象。这是一个例子(伪代码):

abstract class IDataLayer
{
    PersonData GetPerson(int); //PersonData would be a row of data from a table for example
    JobData[] GetJobs(int);
    void UpdatePerson(PersonData);
}

class ConcreteDataLayerSQL : IDataLayer
{
...
}
class ConcreteDataLayerXML : IDataLayer
{
...
}

class PersonBAL
{
    void PersonBAL(personId)
    {
        //What goes here?
    }

    JobBAL[] GetJobs()
    {
       //What goes here?
    }
}
class Program
{
    static void Main()
    {
        person = new PersonBAL(1);
    }
}

所以问题是,PersonBAL 怎么知道要使用哪个 ConcreteDataLayer? 我正在考虑几个选项:

1:将具体的数据层传递给 person。当您开始添加需要与数据层交互的新类时,这会变得很痛苦(例如 new PersonBAL(IDataLayer, int),然后是 new JobBAL(IDataLayer, int) 等)

2:创建一个静态对象来保存要使用的数据层(读取:全局变量)

还有其他想法吗?

【问题讨论】:

    标签: design-patterns oop dependency-injection n-tier-architecture


    【解决方案1】:

    您要解决的问题是“依赖注入”。

    假设这是 .NET 代码(您的伪代码语言看起来很像 C#),您可能需要研究像 Spring.NET 这样专为此类事情设计的框架。

    【讨论】:

    • 虽然我很欣赏对术语的澄清,但我想要一个更好的解决方案,而不是让一个框架来处理这个问题。框架如何处理问题?
    【解决方案2】:

    由于您列出的原因,我认为在每个构造函数中传递类将具有挑战性,因为更改代码以使用不同的类会很容易出错。

    依赖注入是 Spring 框架的核心。 Spring 使用 XML 配置文件来描述类之间的关系。对于您的用例,您可以在配置中指定要实例化的特定类型,因此您只需进行一次更改即可切换实现。

    Spring 是一个众所周知且经过测试的框架,但您当然不需要它来解决问题。您可以很好地为配置文件编写自己的代码。无论哪种方式,这本质上都是您提到的第二个选项的变体。

    【讨论】:

      【解决方案3】:

      你可以在你的代码中放置一层间接层,这样你就不会直接构造一个PersonBAL,而是你有一个PersonBALFactory,你可以用它来构造你的PersonBAL实例。工厂依赖于通过构造函数传入的 IDataLayer(并且在您的应用程序启动时连接),您告诉工厂使用 PersonId 创建人员,它创建一个新的 PersonBAL 传递 ID 和IDataLayer。这样用户就不需要关心您使用的是哪个 IDataLayer,它是在启动时在应用程序配置中设置的,用户只需使用他们知道的信息请求新的 PersonBAL。

      DI 框架将帮助您配置所有依赖注入,以便将正确的类型传递给构造函数,并且一旦您拥有许多工厂或复杂的依赖图。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-29
        • 2014-08-28
        • 1970-01-01
        • 2015-11-09
        • 2017-09-16
        • 2011-04-04
        • 1970-01-01
        相关资源
        最近更新 更多