ASP.NET MVC Web应用程序中的控制器是否应该调用存储库,服务或两
|
我的ASP.NET MVC Web应用程序中的控制器开始有一些业务逻辑的膨胀。网络上的示例都显示简单的控制器操作,只需将数据从存储库中提取出来,并将其传递给视图。但是,如果您还需要支持业务逻辑呢?
比方说,履行订单的动作也需要发送电子邮件。我是否将此粘贴到控制器中并将此逻辑复制/粘贴到任何其他履行订单的操作?我的第一个直觉将是创建一个像OrderFulfillerService这样的服务,它将处理所有这些逻辑,并且控制器动作被调用。但是,对于从数据库中检索用户列表或订单等简单操作,我想直接与存储库进行交互,而不是将该调用包含在服务中。 这是可以接受的设计模式吗?控制器操作在需要数据访问时需要业务逻辑和存储库时调用服务? 解决方法
您的控制器(在MVC项目中)应该在服务项目中调用对象。服务项目是处理所有业务逻辑的地方。
这是一个很好的例子: public ActionResult Index()
{
ProductServices productServices = new ProductServices();
// top 10 products,for example.
IList<Product> productList productServices.GetProducts(10);
// Set this data into the custom viewdata.
ViewData.Model = new ProductViewData
{
ProductList = productList;
};
return View();
}
或依赖注射(我的fav) // Field with the reference to all product services (aka. business logic)
private readonly ProductServices _productServices;
// 'Greedy' constructor,which Dependency Injection auto finds and therefore
// will use.
public ProductController(ProductServices productServices)
{
_productServices = productServices;
}
public ActionResult Index()
{
// top 10 products,for example.
// NOTE: The services instance was automagically created by the DI
// so i din't have to worry about it NOT being instansiated.
IList<Product> productList _productServices.GetProducts(10);
// Set this data into the custom viewdata.
ViewData.Model = new ProductViewData
{
ProductList = productList;
};
return View();
}
现在..什么是服务项目(或什么是ProductServices)?这是一个具有业务逻辑的类库。例如。 public class ProductServices : IProductServices
{
private readonly ProductRepository _productRepository;
public ProductServices(ProductRepository productRepository)
{
_productRepository = productRepository;
}
public IList<Product> GetProducts(int numberOfProducts)
{
// GetProducts() and OrderByMostRecent() are custom linq helpers...
return _productRepository.GetProducts()
.OrderByMostRecent()
.Take(numberOfProducts)
.ToList();
}
}
但这可能是所有如此铁杆和混乱…所以一个简单版本的ServiceProduct类可能是(但我不会真的推荐)… public class ProductServices
{
public IList<Product> GetProducts(int numberOfProducts)
{
using (DB db = new Linq2SqlDb() )
{
return (from p in db.Products
orderby p.DateCreated ascending
select p).Take(10).ToList();
}
}
}
所以你去您可以看到所有的逻辑都在服务项目中,这意味着您可以在其他地方重用该代码。 我在哪里学习? 从Rob Conery年的MVC StoreFront媒体和tutorials.切片面包最好的东西。 HTH。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc-3 – Mini Profiler不渲染脚本
- asp.net-mvc – ASP.NET MVC跟踪问题
- asp.net – 跟踪SignalR连接ID以查看它们是否真的存在
- asp-classic – 在VBScript中检查NULL的错误
- asp.net – 如何使用EntityFramework种子数据代码第一次迁移
- asp.net – RadComboBox中的重音不敏感搜索
- ASP.NET框架中的异步页面 – 其他线程在哪里,如何重新连接?
- asp.net-mvc – 具有指定操作的Response.RedirectToRoute
- “ASP.NET”错误:拒绝访问远程服务器,因为不存在登录映射
- 我们可以将asp.net mvc 4应用程序部署到带有Windows容器的d
- asp.net – 什么时候Request.Form [“name”]为n
- 实体框架 – MVC3应用程序/服务层/存储库层/ POC
- asp.net-mvc – MVC模型绑定:为什么我不能绑定到
- 获得一个字符串的汉语拼音码
- asp.net-mvc-3 – Razor:隐藏密码控制(2页注册)
- asp.net-mvc – ASP.NET MVC:三态复选框
- asp.net-mvc – ASP.NET MVC Views可以在不同的项
- vbscript – 从ASP脚本使用wscript.shell时无法引
- asp.net网站与网络应用程序
- asp.net-mvc-2 – 我的MVC2站点需要一个crossdom
