NetTiers是Net下面一款出色的自动生成模版能够非常快速地生成数据访问层并且可以方便地进行扩展
支持的特性也相当多除常规的CRUD+分页查询外还包含以下特性:
自定义存储过程的自动封装 这样就不用额外写代码就可以完成自定义存储过程的调用了 但是存储过程要以它规定的命名规则进行命名这样它才会识别出来
对索引列生成查询方法 比如在用户表中经常给定用户名和密码这两个条件 在这两个列上建立非聚集索引那么NetTiers将自动生成包含这两个条件的查询方法
支持Deepload级联查询 这个虽然效率不是很高但在中小型的应用上还是相当方便地
使用Processor机制来完成一系列流程的连续调用进行事务处理
具体的使用方法可以参见园子里面其它人写的文章或官方文档这里主要要讨论的是如果使用NetTiers生成的东西
通常我们的项目一般会使用一些源代码管理工具这样的话在编辑一份代码文件之前需要将它签出来但是在实际工具中数据库的结构可能随时发生变化在这种情况下就需要重新使用NetTiers进行代码生成如果我们直接使用它生成出来的解决方案进行开发的话就会遇到一些麻烦这时要手动将它要生成的文件一个一个签出来几乎太困难了那么怎么办呢?
我的办法是不直接使用它生成的解决方案而是引用它编译之后的程序集扩展部分的代码写在自己的工程中从它生成的基类继承过来 这样每将即使是要改库只需要将它生成的几个程序集签出来重新运行CodeSmith生成代码后把编译出来的程序集拷贝过来覆盖掉再提交就OK了
这时我们的Service层看起来可能是这个样子:
public class UsersFacade : UsersServiceBase
{
public UsersFacade()
: base() { }
public Users ValidateUser(string username string password)
{
SqlFilterBuilder<UsersColumn> filter = new SqlFilterBuilder<UsersColumn>();
filterJunction = SqlUtilAND;
filterAppendEquals(UsersColumnName username);
filterAppendEquals(UsersColumnPassword password);
int count = ;
TList<Users> users = DataRepositoryUsersProviderGetPaged(filterToString() null out count);
if (usersCount > )
return users[];
else
return null;
}
public Users ValidateUserAlter(string username string password)
{
TList<Users> users = Find(stringFormat(Name = {} AND Password = {} username password));
if (users != null && usersCount > )
return users[];
else
return null;
}
public Users ValidateUserThird(string username string password)
{
GBDataParameterizedSqlFilterBuilder<Users> filter = new ParameterizedSqlFilterBuilder<Users>();
filterAppendEquals(Name Darkangel);
filterAppendEquals(Password );
TList<Users> users = GBDataDataRepositoryUsersProviderFind(filterGetParameters());
if (users != null && usersCount > )
return users[];
else
return null;
}
}
再看看单元测试的代码:
[TestFixture]
public class SampleFixture
{
Users testUser = new Users();
[TestFixtureSetUp]
public void Setup()
{
Users u = new Users();
uName = Darkangel;
uPassword = ;
uUserId = IdentityGeneratorInstanceNextIdentity();
testUserUserId = uUserId;
UsersFacade fa = new UsersFacade();
faInsert(u);
}
[TestFixtureTearDown]
public void Clearup()
{
UsersFacade f = new UsersFacade();
fDelete(testUserUserId);
}
[Test]
public void GetAllUserTest()
{
UsersFacade facade = new UsersFacade();
//TList<Users> list = facadeFind(Name=Darkangel);
TList<Users> list = facadeGetAll();
ConsoleWriteLine(Toatal user acount is : + listCount);
AssertIsNotNull(list);
AssertIsTrue(listCount > );
}
[Test]
public void ValidateUserTest()
{
UsersFacade facade = new UsersFacade();
Users u = facadeValidateUser(Darkangel );
AssertIsNotNull(u);
AssertIsTrue(uUserIdLength > );
}
[Test]
public void ValidateUserAlterTest()
{
UsersFacade facade = new UsersFacade();
Users u = facadeValidateUserAlter(Darkangel );
AssertIsNotNull(u);
AssertIsTrue(uUserIdLength > );
}
[Test]
public void ValidateuserThirdTest()
{
UsersFacade facade = new UsersFacade();
Users u = facadeValidateUserThird(Darkangel );
AssertIsNotNull(u);
AssertIsTrue(uUserIdLength > );
}
}
这样我们就只需要管理我们的生成配置文件就可以了