我刚刚开始使用MVC,并选择让我的解决方案为数据库交互和UI项目(希望是一种可接受的工作方式)保持单独的项目。 UI引用BL,但BL不保留对UI的引用。因此,对于我将值传递给BL,我必须将参数设置为dynamic
(例如下面的代码),是否应该避免这种情况?如果是这样的话?(除了缺乏智能感知)。
public class MyController : Controller
{
[HttpPost]
public ActionResult MyAction(MyActionViewModel vm)
{
if (!ModelState.IsValid)
{
return View(vm);
}
//pass formCollection to model to do stuff with
int isSuccessful = ModelName.Insert(vm);
return RedirectToAction(....);
}
}
public partial class ModelName
{
public static int Insert(dynamic theVm)
{
using (ModelEntities ctx = new ModelEntities ())
{
ModelName mn= new ModelName();
mn.AddressLineOne = theVm.AddressLineOne;
mn.AddressLineTwo = theVm.AddressLineTwo;
ctx.TheTargetedEntity.Add(mn);
ctx.SaveChanges();
return mn.id;
}
}
}
一位同事建议我应该创建一个BL和UI引用的附加项目,这样我就可以强大地输入我传递的参数(尽可能避免弱类型化)。我的问题在于,在这种情况下,它似乎在解决方案中引入了不必要的元素。
我是以过于简单的方式查看此问题,还是建议过度复杂化问题,或者我们都完全错过了一些内容(我们都是MVC的新手,来自网络表单,网站将是中小型位点)。
答案 0 :(得分:1)
您的BL项目应该对UI一无所知,这是对的。我认为使用动态不是一个好主意。您应该将ViewModel对象转换为BL对象。您可以使用AutoMapper执行此操作http://automapper.org/
答案 1 :(得分:1)
我认为不是将动态传递给BLL,而是更好地为模型创建项目并将模型放在那里,因此模型库可以在UI和BLL之间共享,而不会破坏任何规则并且不会使BLL依赖于UI
使用动态你想念的东西不是vs intellisense,它是打字工作的。
项目的结构将是:
技术上模型项目可以在BLL中合并而不会破坏规则,但是在单独的程序集中创建它们会有其好处。
您应该在您的时间,预算,项目规模之间进行权衡,以做出正确的决定。但首先,这3层就足够了(而你可以将主题减少到2层)。
答案 2 :(得分:0)
我认为你应该使用动态废弃并寻找更严格的定义参数。首先,当其他人正在阅读您的代码和编写单元测试时,它会使您的意图更加清晰。
如果您知道正在插入哪个实体,那么您可以明确地将其作为参数传递。如果您不知道正在插入哪个实体,那么您可以传递每个实体继承的基类或接口。此类或接口将定义使用它的所有实体共有的属性,例如
public class BaseEntity
{
public int Id {get; set;}
}
public partial class ModelName : BaseEntity
{
//Properties unique to ModelName
}
您应该在模型之外编写映射代码。如果你想让你的控制器变薄,你可以在两层之间创建一个单独的。
考虑创建一个单独的类来容纳您的实体操作,而不是使用静态函数。我觉得在这里使用静态方法违反了OO设计。创建这个单独的类不需要你编写比你更多的代码,但它会重新安排你的代码看起来更干净。
public class BusinessService()
{
public int Insert(ModelName model)
{
ctx.TheTargetedEntity.Add(model);
ctx.SaveChanges();
return model.id;
}
}
public class PresentationService()
{
public int Insert(MyActionViewModel theVm)
{
ModelName mn = new ModelName();
mn.AddressLineOne = theVm.AddressLineOne;
mn.AddressLineTwo = theVm.AddressLineTwo;
return businessService.Insert(mn);
}
}
我会按如下方式添加项目引用: 控制器 - > PresentationService - > BusinessService - > DB