叶子的家

~●    ~●  ~●          ~●   ~●~●                           ○
    离成功还很远,距离长着叻,Fighting!
posts - 39, comments - 636, trackbacks - 17, articles - 1
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

【简介】
        我本来很早就想移植这个例子了,只是一直因为各种原因滞后了开发时间。虽然Castle主页上面有PetStore的项目,但一直都是空的,SVN上也没有消息。通过这个例子,希望能更深入Castle的设计思想,用这强大的框架为什么做更多的事情。我刚刚完成Model与Dal层的移植,下面共享给大家。

【前提】
        1。VS.NET 2003,没在VS05上测试过
        2。NUnit 2.2.7
        3。Castle相关的DLL我已经提供,如果你安装了Castle工具包,可能会出现版本不匹配的问题。
        4。安装PetShop3,确保PetShop3可以在你机器上正常运行。
        5。将MSPetShopOrders中的表移到MSPetShop中,原因在下面。

【移植】
        1。Model层改用Castle.ActiveRecord实现,我原本选择直接Nhibernate,但是AR是Castle的头条项目,顺便也体验下,或许能发现少许实际应用方面的问题。
        2。DAL层使用ActiveRecordFacility和TransactionFacility。
        3。TestCase中是用IOC的,这意味着在以后的BLL层和WEB层都使用IOC,这么强大的东西为什么不使用呢?是吧,呵呵。

【问题】
        1。多数据库配置问题,因为我用ActiveRecordFacility,我配置多数据库时候不成功,搞了很久所以放弃了。由于这个原因,我把PetShop中的其中一个数据库MSPetShopOrders中的表(3个表)都移动到MSPetShop这个数据库中,以后我再做修正,因为我现在不知道是什么问题导致配置失败的。
        2。IProduct.GetProductsBySearch我尚未实现。
        3。关于优化,目前我没有做任何DAL层的优化操作,你可以给我提提意见。

【实现】
        1。因为作为移植,所以我没有更改到PetShop3中的所有数据表字段、关系和结构,或者以后在重构或者优化中会再做处理。
        2。我保留了原的Model,因为这样做在做BLL层和WEB层中处理的时候,我无需做大修改。这样处理后,PO和VO就分离了,原的Model是VO,ActiveRecord中的Model是PO。
        3。保留所有IDAL接口,同样是为了适应BLL层的移植。

【抢鲜下载】
        1。目前提供下载的有三个项目包:PetShopDAL、PetShopDAL.Test和PetShopModel:http://files.cnblogs.com/wj/PetShop_Model_DAL.rar
        2。NUnit和数据库结构图






       

Feedback

#1楼    回复  引用    

2006-05-14 21:47 by cw [未注册用户]
很好啊, 不错.

#2楼    回复  引用    

2006-05-14 21:48 by cw [未注册用户]
支持下.

#3楼    回复  引用  查看    

2006-05-15 08:21 by 命运有自己的梦!      
很久没看到您发Castle的开发文章了,我一开始学Castle就是参考您写的文章,前两天使用MonoRail开发,遇到了很多的问题,只是苦于找不到与您联系的QQ或是MSN,自己硬是用穷举的方式来解决问题。现在好了终于有个完整的例子可以参考了,我的QQ:24615289,Msn:jickjick520@hotmail.com,有空的时候加我一下,我有些问题想向您请教!

#4楼 [楼主]   回复  引用  查看    

2006-05-15 09:14 by 绿叶      
@命运有自己的梦!
你可以给我发Email,msn和QQ不常用,我的email你在左边可以看到。我也很希望能和你交流以下。

#5楼    回复  引用    

2006-05-15 21:21 by ddee [未注册用户]
支持一下

#6楼 [楼主]   回复  引用  查看    

2006-05-16 00:07 by 绿叶      
thanks
model中没有用到LAZY,另外BLL层已经完成移植,改天放上来,现在在移植web层,挺烦的。。

#7楼    回复  引用    

2006-05-16 08:48 by newlee.cn [未注册用户]
在ibatis上有npetshop源码下载,使用castle,dal使用ibatis.net,可以去看看。
http://ibatis.apache.org/dotnetdownloads.html
:)

#8楼 [楼主]   回复  引用  查看    

2006-05-16 09:20 by 绿叶      
@newlee
thanks, 不过我看了不是用Castle的monorail的,看一下web.config就知道了啊。不知道你说的用castle其中一个组件吧?yes?
这年头喜欢匿名哪?这么多人匿名

#9楼    回复  引用    

2006-05-16 21:42 by newlee.cn [未注册用户]
对,不是用的monorail,而是castle.MVC。
个人感觉使用monorail需要使用vm,无法利用ms asp.net 2.0提供的很多功能,虽然可以和java web开发保证一致,不过...
:)

#10楼    回复  引用    

2006-05-16 21:52 by newlee.cn [未注册用户]
不过castle对castle.MVC的支持也很差,所以,前段时间,我不那个例子去掉了castle.MVC,直接使用asp.net 2.0+castle+ibatis.net,在vs2005上编译运行了一下。呵呵

#11楼 [楼主]   回复  引用  查看    

2006-05-16 23:10 by 绿叶      
@newlee
哦~我现在是用vm来的,在弄权限这块,似乎和asp.net不兼容,你对验证那里有什么看法么?有没有castle的做验证的例子?我现在的做法是靠自己判断cookie,似乎。。。。

#12楼    回复  引用    

2006-05-20 08:53 by zzsu [未注册用户]
或许,我的方法比较苯:
Controller
[Filter(ExecuteEnum.BeforeAction, typeof(SecurityFilter))]
Filter:
public bool Perform(ExecuteEnum exec, IRailsEngineContext context, Controller controller)
{
if ( !context.Session.Contains("User") )
return RedirectToLoginAndReturnFalse(context);

Account account;
try {
EISPrincipal user = (EISPrincipal)context.Session["User"];

if ( user == null || !(user.Identity.IsAuthenticated))
return RedirectToLoginAndReturnFalse(context);

account = Account.Find(int.Parse(user.Identity.Name));

} catch (Exception) {
return RedirectToLoginAndReturnFalse(context);
}

MonoRailAuthorizeService service2 = (MonoRailAuthorizeService)
((GlobalApplication)context.UnderlyingContext.ApplicationInstance).Container[typeof(MonoRailAuthorizeService)];
MonoRailURL requestedUrl = MonoRailURL.Find(context.UrlInfo.Area, context.UrlInfo.Controller, context.UrlInfo.Action);
bool permission = service2.IsPermit(account, requestedUrl);

if ( !permission )
RedirectToDenyAndReturnFalse(context);

return true;
}

private bool RedirectToLoginAndReturnFalse(IRailsEngineContext context)
{
context.Session["ReturnURL"] = context.Url;
context.Flash.Add("alarm", "You must login to access this page/action.");
context.Response.Redirect("account", "login");

return false;
}

private bool RedirectToDenyAndReturnFalse(IRailsEngineContext context)
{
context.Session["ReturnURL"] = context.Url;
context.Response.Redirect("account", "deny");

return false;
}
Account.Authenticate

[SkipFilter(typeof(SecurityFilter))]
public void Authenticate(int id, string password)
{
try {
Account account;
if ( service.IsValid(id, password) )
{
account = Account.Find(id);
account.IsAuthenticated = true;
Context.Session["User"] = new EISPrincipal(account);

string returnURL = (string)Session["ReturnURL"];
if ( returnURL != null && returnURL != "" )
{
Redirect(returnURL);
}else{
Redirect("Home", "Index");
}
// PropertyBag.Add("ReturnURL", returnURL);
}else{
Flash.Add("error", "Wrong worker id or password, try again!");
RedirectToAction("Login");
}
} catch (Exception ex) {
throw new Exception(string.Format("Unable to login user: {0} due to \"{1}\"", id, ex.Message));
}
}

AuthorizeService:

public class MonoRailAuthorizeService
{
public virtual bool IsPermit(Account account, MonoRailURL url)
{
MonoRailAuthorization[] authorizations = MonoRailAuthorization.FindAll(url);

if (authorizations == null || authorizations.Length == 0)
return false;

bool permit = false;

foreach (MonoRailAuthorization authorization in authorizations)
{
if (authorization.PrincipalType == MonoRailAuthorizePrincipalType.User)
{
if (authorization.PrincipalName == account.ID.ToString())
{
if (authorization.PermissionType == MonoRailAuthorizePermissionType.Allow)
permit = true;
else
return false;
}
}
else
{
if (account.IsInRole(authorization.PrincipalName))
{
if (authorization.PermissionType == MonoRailAuthorizePermissionType.Allow)
permit = true;
else
return false;
}
}
}

return permit;
}
}
}

MonoRailURL:
int ID{get,set}
string Area{get, set}
string Controller{get,set}
string Action{get, set}

MonoRailAuthorization:
MonoRailURL MonoRailURL{get, set}
MonoRailAuthorizePermissionType PermissionType{get, set}
MonoRailAuthorizePrincipalType PrincipalType{get, set}

#13楼 [楼主]   回复  引用  查看    

2006-05-20 23:12 by 绿叶      
@zzsu
thanks for ur code。
我现在也是用filter处理的,不过我更倾向于与asp.net兼容的方式处理。

to all:
关于petshop的移植web层到5月20号为止,已经完成用户部分和product的部分移植,由于时间忙不过来,所以请大家耐心等等了。

#14楼 [楼主]   回复  引用  查看    

2006-05-31 00:05 by 绿叶      
@all
5.31 PetShop 已经完全移植完毕,修正bug中,近期将放上来。同时祝大家儿童节快乐哇。不知道谁能提供一个演示空间呢。thanks.

cheer!




标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接: