如何将业务层添加到C#MVC应用程序

时间:2014-05-22 22:08:21

标签: asp.net-mvc entity-framework asp.net-mvc-4 dependency-injection business-logic-layer

我在Github上有一个项目,我正在努力开发,展示如何以实用的方式使用最佳实践。但是我的概念有问题。当我这样做时,我会回到基础并尝试一个简单的例子。要查看该项目,请点击以下链接:

https://github.com/franasm/Store.git

工作部门DI / IOC完全正常工作。破解的分支是我尝试添加简单业务层时发生的事情。所以我回到了基础。

我创建了一个标准的简单MVC4应用程序。 然后我添加了EF5一个表(上面项目中的产品表)。

我决定添加一个没有任何DI / IOC或任何花哨东西的业务层。但这个概念让我很困惑。

我想在这个例子中做的就是创建一个扩展产品类的类,添加一个名为TaxAmt的属性,并在实例化类时添加一个计算TaxAmt的方法。

我尝试了各种各样的方法但得到了各种各样的错误。从堆栈溢出execptions到实例不设置异常。大多数情况下,事物只是没有显示值,因为Product.Price字段未初始化。

我也发现我的BL在错误的地方:

我有我的模特,
那我的BL,
那我的控制器。

对于这个小例子很好。但是因为最接近我可以得到的工作示例是创建由EF生成的现有类的部分类,当我将其拆分为使用DI / IOC时,BL将在接口的错误一侧,因为它将是Model类(partial class)的一部分。

我希望我的图层清晰分开,如: EF Model类,
接口方面,
回购,
BL,
控制器,
的ViewModels,
视图。

因为Repo负责crud操作。 BL应该以此为基础。在读取了产品详细信息(其中一个是价格)之后,BL可以获取此信息,进行税务计算,然后控制器可以使用它。

我不确定我的想法是否正确。

在大多数情况下,我强烈反对BL应该是模型的一部分。但即使如上所述我的人为例子也是如此。我仍然无法让它工作。然而,我会寻找一个解决方案,以期继承模型类,扩展它,然后将它与repo一起使用。但这又引起了我的反响。 crud由repo层完成,它无法访问BL,因此BL如何初始化以进行税收计算。我没有加倍对象,每个模型实例的POCO,以及同一对象的BL实例。

我真的很困惑......

基本上,我没有包含代码,因为我所做的一切都是制作一个简单的表,一个简单的mvc项目,添加了EF5模型,将它连接起来进行crud操作并确保它正常工作。然后尝试按照描述添加BL。 BL文件夹中的单个类,或者被定义为模型的部分类(不理想),或者直接继承模型类(也不确定这是否很酷)。理想情况下,我希望能够使用DI,将我的repo注入我的BL,然后将我的BL注入我的控制器。

如果有人知道如何做到这一点,你可以通过提供分步说明(最好是一些示例代码)或解释如何进行这个过程以及为什么我这样做,请给我一个答案。困惑。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

因此,我所看到的创建具有业务层和EF层的MVC应用程序的最佳方法是使用3层布局。

我们有数据项目,可能是您的EF项目(也可能是SSDT或类似的东西),然后是"服务" layer(实际上可能是一个Web服务,但也可能只是常规类输出DLL)。我有时也称这是我的代理商#34;层。这里的类托管模型,并将模型从EF代码转换为这些模型。以下是使用LINQ的示例:

public static BlogModel GetBlog(string ID)
    {
        Blog b;
        using (Entities cm = new Entities())
        {
            b = cm.Blogs.Where(blog => blog.ID == ID).FirstOrDefault();
        }

        if (b != null)
            return GetBlog(b);

        return null;
    }

因此,此方法将使用EF和LINQ to SQL从数据库中获取Blog对象。现在,把它变成模型:

public static BlogModel GetBlog(Blog blog)
    {
        return new BlogModel()
        {
            Title = blog.Title,
            Enabled = blog.Enabled
        };
    }

这当然也使用了一个BlogModel对象,其中包含字符串Title和bool Enabled。就像例子一样。

现在,您的业务层中有两个返回模型的方法。您现在可以在控制器中调用它,如下所示:

    [Route("/Blogs/{id}", RouteName = "Blogs")]
        public ActionResult ViewBlogs(string id)
        {
            BlogModel m = BusinessNamespace.BlogClass.GetBlog(id);
            return View("Blogs", m);
        }

现在,假设你有一个Blogs.cshtml视图,并且设置了正确的模型,你应该很高兴。

希望有所帮助。