Lil*_*sey 0 architecture design-patterns inversion-of-control n-tier-architecture
使用C#,asp.net 3.5,SqlServer 2005,
试图将一些控制反转与3层架构结合到我当前的任务中.
不知道这是一个好主意还是令人难以置信的愚蠢:
我创建了用户界面层,业务层和数据层.
UI收集4个值,News是业务层类的实例(称之为c),使用4个值初始化它.
然后,UI调用Business Layer类的该实例的方法来保存数据.
Business Layer类方法创建一个tsql字符串,例如
String.Format(@"插入table1(col1,'col2','col3',col4)值({0},{1},{2},{3}); select @@ identity",c.one ,c.date1,c.date2,c.four);
并将字符串传递给数据层中类的int方法.
数据层使用字符串作为ExecuteScalar的CommandText,并将@@ identity返回到业务层.
我会使用相同概念的变体来通过datareader检索数据.
数据量不会很大,这不会是一个高容量的应用程序.
我过去这样做的方法是将在ui中收集的4个值,通过业务层传递给数据层设置sqlparms,将值传递给存储过程等,将它们传递回业务层,等等
噢亲爱的!有很多话要说我甚至不知道从哪里开始.
首先,我不知道IoC在哪里适合你,因为你正在new
向左和向右上课.
接下来,您正在强制BL层构造一个不应该执行的SQL语句.更糟糕的是,你基本上是连接字符串来获取SQL语句.这是一个可怕的,可怕的做法(参见SQL注入).
现在,我并没有真正看到你的BL内部存在任何"业务逻辑".你正在搞乱原始的ADO.NET,现在这是一个巨大的禁忌(除非你在优化性能).查看NHibernate或BLToolkit.
这是我推荐的.查看服务层的全部内容,并尝试充实系统中的"服务".既然你现在没有任何"业务逻辑",我认为IFooPersistenceService
是唯一的服务.
接下来,阅读有关MVP和MVC的内容.这将有助于您更好地构建UI.
最后,这是我看到整体控制流程的方式.
用户以某种形式输入多个值,然后单击"保存".你IView
提出了一个由Saved
事件处理的事件IPresenter
.然后,它从属性中获取这些值IView
,创建业务对象(或对象图)以保存这些值,调用IFooPersistenceService
(Foo
作为对象的名称)将其保存到DB.IFooPersistenceService
调用您选择的任何ORM并将值移交@@SCOPE_IDENTITY
给IPresenter
.
一旦你开始有任何逻辑,在之间添加一个额外的层IPresenter
并IFooPersistenceService
保持所述逻辑.
看到这个(递归地).