我使用带有telerik控件的asp.net编程数据驱动的应用程序(v2009 q2)。 我有一个名为BLL的类,它包含(几乎只有)静态类,它返回不同的对象,并将一些id作为参数。通常将对象组返回为列表。
我的问题是,是否有任何architrectural缺陷,总是使用静态。我知道人们将他们的Busines Layer和DataAccess层作为不同的项目。它作为一个项目的优势是什么?所以我可以添加更多功能,或者只是它更整洁。
提前致谢
答案 0 :(得分:2)
使用静态方法作为进入方法并不是一个特别重要的问题。这实际上取决于您是否有需要存储状态的工作区域,因为静态定义可能不允许您存储或分离状态信息。幸运的是,从使用静态声明到成员声明向后退通常不如反向那么痛苦。如果从这些方法返回的项目仅对状态负责,您甚至可能不会遇到此问题。
单独的库/项目对于分区工作单元很有用。没有严格的要求,所有内容必须分成不同的库,尽管你可能会看到带有静态成员变量的怪癖,特别是在Dave Swersky提到的多线程应用程序中。
拥有单独的库还可以带来以下好处:
但是,有些人发现大型单片库对他们来说效果更好。以下是在这种情况下非常重要的一些好处。
最后,我注意到的一件事是听起来你已经实现了嵌套的静态类。如果使用您的工作的其他人在智能感知或其他环境快捷方式不可用的环境中,他们可能会发现此设置使用起来非常麻烦。您可以考虑将某些级别的嵌套展开到单独的(或嵌套的)命名空间中。这对于减少声明感兴趣项目所需的键入量也是有益的,因为名称空间声明只需要存在一次,其中每次都需要存在静态嵌套项目。你的同行会喜欢这个。
答案 1 :(得分:1)
将BLL和DAL放在单独的项目中(即单独的程序集)意味着它们可以与不同的用户界面一起使用而无需重新编译,但更重要的是,DLL的边界接口和依赖关系定义相对明确(尽管它不保证一个伟大的设计,它至少强制分离)。它仍然可以有一个具有很大逻辑分离的单一组件,因此它不是必需的也不够。
就静态方法与业务对象类而言,这可能是不寻常的,并且可能有缺点,但它并不会真正影响您的图层是否分离。
答案 2 :(得分:0)
如果您的应用程序是无状态的,那么全静态方法/类应该不是问题。但是,如果您的应用程序是多线程的并且BLL确实已读取并提交,则可能会遇到线程安全问题。
答案 3 :(得分:0)
单独项目的一个优点是,如果您需要更新应用程序但只更改BLL,则可以进行更改,重新编译DLL并将其放在IIS中部署应用程序的bin文件夹中,而不必重新部署整个Web应用程序
答案 4 :(得分:0)
我的问题是,有没有 总是这样的结构缺陷 使用静态。
该方法的一个缺陷是您无法将接口应用于静态方法。可能的解决方法是使用Singleton模式,尽管您需要注意线程问题。
我知道人们会制作他们的商务图层 和DataAccess图层不同 项目。它的优点是什么? 是一个项目?所以我可以添加更多 功能或只是它更整洁 那样。
优点:
答案 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");
}
}
}