Asp MVC解决方案结构

时间:2015-09-18 11:42:37

标签: c# asp.net-mvc asp.net-mvc-4 architecture entity-framework-6

我刚刚开始使用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的新手,来自网络表单,网站将是中小型位点)。

3 个答案:

答案 0 :(得分:1)

您的BL项目应该对UI一无所知,这是对的。我认为使用动态不是一个好主意。您应该将ViewModel对象转换为BL对象。您可以使用AutoMapper执行此操作http://automapper.org/

答案 1 :(得分:1)

我认为不是将动态传递给BLL,而是更好地为模型创建项目并将模型放在那里,因此模型库可以在UI和BLL之间共享,而不会破坏任何规则并且不会使BLL依赖于UI

使用动态你想念的东西不是vs intellisense,它是打字工作的。

项目的结构将是:

  • 模型项目(独立,仅包含模型)
  • BLL项目(有模型参考,包含数据访问和业务逻辑)
  • UI项目(有BLL参考,有模型参考,包含ViewModels,控制器,视图)

技术上模型项目可以在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