业务逻辑层

时间:2009-11-18 21:18:30

标签: asp.net business-logic-layer

我使用带有telerik控件的asp.net编程数据驱动的应用程序(v2009 q2)。 我有一个名为BLL的类,它包含(几乎只有)静态类,它返回不同的对象,并将一些id作为参数。通常将对象组返回为列表。

我的问题是,是否有任何architrectural缺陷,总是使用静态。我知道人们将他们的Busines Layer和DataAccess层作为不同的项目。它作为一个项目的优势是什么?所以我可以添加更多功能,或者只是它更整洁。

提前致谢

6 个答案:

答案 0 :(得分:2)

使用静态方法作为进入方法并不是一个特别重要的问题。这实际上取决于您是否有需要存储状态的工作区域,因为静态定义可能不允许您存储或分离状态信息。幸运的是,从使用静态声明到成员声明向后退通常不如反向那么痛苦。如果从这些方法返回的项目仅对状态负责,您甚至可能不会遇到此问题。

单独的库/项目对于分区工作单元很有用。没有严格的要求,所有内容必须分成不同的库,尽管你可能会看到带有静态成员变量的怪癖,特别是在Dave Swersky提到的多线程应用程序中。

拥有单独的库还可以带来以下好处:

  1. 在开发过程中更好地分离变更,因为项目边界通常与源控制边界重合,允许更多人同时在整个平台上工作。
  2. 可以在生产中独立更新的单独部件,前提是布局和接口兼容。
  3. 更好地组织每个层的给定段的行为,特征和角色相交,无论是BLL还是DAL。一些开发人员倾向于根据允许用户对给定BLL中提供的项目进行操作来严格隔离组件。
  4. 但是,有些人发现大型单片库对他们来说效果更好。以下是在这种情况下非常重要的一些好处。

    1. 较旧组件和依赖项很少更改的项目的编译时间更快(对C / C ++开发人员尤其重要!)。统称不会更改的源文件可以提示并允许编译器避免重新编译整个项目。
    2. 单个(或低计数)文件升级和管理,适用于最大限度地减少给定位置的对象数量的项目。对于那些提供图书馆供其他方消费的人来说,这是非常理想的,因为人们不太容易因个别项目的发布或更新而无序。
    3. Visual Studio .NET项目中的自动命名空间布局,其中使用子文件夹自动隐含了新代码添加时将出现的初始命名空间。不是特别好的特权,但有些人觉得这很有用。
    4. 通过数据库或服务器抽象分离BLL和DAL组。这有点中间立场,但作为一个组织层面,人们发现这个水平对于长期发展更为舒适。这允许人们通过存储或接收的位置来识别事物。但是,作为权衡,个别项目可能更复杂 - 虽然可通过#3进行管理。
    5. 最后,我注意到的一件事是听起来你已经实现了嵌套的静态类。如果使用您的工作的其他人在智能感知或其他环境快捷方式不可用的环境中,他们可能会发现此设置使用起来非常麻烦。您可以考虑将某些级别的嵌套展开到单独的(或嵌套的)命名空间中。这对于减少声明感兴趣项目所需的键入量也是有益的,因为名称空间声明只需要存在一次,其中每次都需要存在静态嵌套项目。你的同行会喜欢这个。

答案 1 :(得分:1)

将BLL和DAL放在单独的项目中(即单独的程序集)意味着它们可以与不同的用户界面一起使用而无需重新编译,但更重要的是,DLL的边界接口和依赖关系定义相对明确(尽管它不保证一个伟大的设计,它至少强制分离)。它仍然可以有一个具有很大逻辑分离的单一组件,因此它不是必需的也不够。

就静态方法与业务对象类而言,这可能是不寻常的,并且可能有缺点,但它并不会真正影响您的图层是否分离。

答案 2 :(得分:0)

如果您的应用程序是无状态的,那么全静态方法/类应该不是问题。但是,如果您的应用程序是多线程的并且BLL确实已读取并提交,则可能会遇到线程安全问题。

答案 3 :(得分:0)

单独项目的一个优点是,如果您需要更新应用程序但只更改BLL,则可以进行更改,重新编译DLL并将其放在IIS中部署应用程序的bin文件夹中,而不必重新部署整个Web应用程序

答案 4 :(得分:0)

  

我的问题是,有没有   总是这样的结构缺陷   使用静态。

该方法的一个缺陷是您无法将接口应用于静态方法。可能的解决方法是使用Singleton模式,尽管您需要注意线程问题。

  

我知道人们会制作他们的商务图层   和DataAccess图层不同   项目。它的优点是什么?   是一个项目?所以我可以添加更多   功能或只是它更整洁   那样。

优点:

  1. 多个开发人员更容易处理(取决于您的环境和源代码管理)
  2. 强制将逻辑/保护级别与解决方案的其余部分分离
  3. 如果您的BLL变大,则更容易分组和管理

答案 5 :(得分:-1)

namespace BLL
{
    public class tblCity
    {
        public tblCity()
        {
            //
            // TODO: Add constructor logic here
            //
        }
        private int iCityId;
        private string sCityName;

        public int CityId
        {
            get
            { return iCityId; }
            set
            { iCityId = value; }
        }
        public string CityName
        {
            get
            {
                return sCityName;
            }
            set
            { sCityName = value; }

        }
        public int InserttblCity()
        {
            DBAccess db = new DBAccess();
            //db.AddParameter("@iSid", iSid);
            db.AddParameter("@sCityName", sCityName);

            return db.ExecuteNonQuery("tblCity_Insert", true);
        }
        public DataSet SelectAlltblCity()
        {
            DBAccess db = new DBAccess();
            return db.ExecuteDataSet("tblCity_SelectAll");
        }
        public DataSet CheckCityName()
        {
            DBAccess db = new DBAccess();
            db.AddParameter("@sCityName", sCityName);
            return db.ExecuteDataSet("tblCity_CheckCity");
        }
        public DataSet SelectDistinctCityWithId()
        {
            DBAccess db = new DBAccess();
            //db.AddParameter("@iCityName", iCityName);
            return db.ExecuteDataSet("tblCity_getLastId");
        }
        public int UpdatetblCity()
        {
            DBAccess db = new DBAccess();
            db.AddParameter("@iCityId", iCityId);
            db.AddParameter("@sCityName", sCityName);
            return db.ExecuteNonQuery("[tblCity_Update]", true);
        }
        public int DeletetbltblCity()
        {
            DBAccess db = new DBAccess();
            db.AddParameter("@iCityId", iCityId);

            return db.ExecuteNonQuery("[tblCity_Delete]", true);
        }
        public DataSet FindPropertyLocationSubCategory()
        {
            DBAccess db = new DBAccess();
            db.AddParameter("@iCityId", iCityId);
            return db.ExecuteDataSet("tblPropertyDetails_FindPropertyLocationSubCategory");
        }
        public DataSet SelectDistinctPLCNAmeWithId()
        {
            DBAccess db = new DBAccess();

            return db.ExecuteDataSet("tblCity_getLastId");
        }

    }
}