我们正在开发一个具有以下架构的.Net应用程序:表示层(使用带有ASP.Net MVC 2的MVC模式),服务层,数据访问层(使用实体框架上的存储库模式).
我们决定将事务管理放在服务层中,但我们不确定如何实现它.我们希望完全在服务层级别控制事务.也就是说,每次控制器调用服务层中的方法时,它都必须是关于数据库更新的原子操作.
如果服务层中提供的不同服务之间没有关系,那么它很简单:每个方法应该在执行结束时提交更改(即,在它使用的上下文中调用save方法).但有时服务层的服务可以协同工作.
例如:我们提供的货运服务具有接收以下参数的确认方法:货件ID,指示其是否对应于新客户或现有客户的标志,客户ID(如果货件确认是针对现有的客户)和客户名称(如果是新客户).如果该标志设置为"新客户",则服务层必须(a)创建客户并(b)确认装运.对于(a)货运服务调用客户服务(已经实现了创建新客户并将其存储在数据库中所需的验证和逻辑).
谁应该在这种情况下提交更改?
我们应该遵循这样的设计模式吗?
我试图将我的应用程序从每个实体的存储库重构到每个聚合根的存储库.
一个基本的例子是我有一个汽车的实体根.汽车有租赁合同.据我所知,没有汽车就不存在合同,因此汽车是合计的根.
我正在尝试实现一个用户视图,它将显示系统中的每个合同(根实体的所有子实体).在重构之前,我可以去我的合同存储库并获取All.由于合同存储库已被删除(因为它不是根)我现在需要将所有汽车从我的存储库中取出然后获得所有合同.
我的存储库有界面
public interface ICarRepository
{
IQueryable<Car> All { get; }
IQueryable<Car> AllIncluding(params Expression<Func<Car, object>>[] includeProperties);
Car Find(long id);
void InsertOrUpdate(Car car);
void Delete(long id);
void Save();
}
Run Code Online (Sandbox Code Playgroud)
我想过创建一个ICarManagementService并让它有一个GetAllContracts方法(可能带有过滤器参数).这是否意味着获得我需要的所有合同,将所有汽车实体与他们的合同拉出来然后检索每个实体相关的租赁合同并过滤它们?
然后,我可以像以前一样将这些传递给控制器并自动映射合同.
这是最佳做法吗?
谢谢
格雷姆
domain-driven-design ddd-repositories aggregateroot service-layer asp.net-mvc-3
我目前正在实习,从我一直学习的MVC中的控制器应该仅用于流量,仅用于流量.我也被告知了一个叫做"服务层"的东西,这听起来像是我应该为控制器做任何数据/业务逻辑的地方.
我一直在寻找关于这方面的示例和教程,但我找不到任何让我感到愚蠢的东西,因为我刚刚在一个月前刚学过MVC.我想知道是否有人能够解释并告诉我如何将以下ActionResult Index业务逻辑转移到"服务层".
public class LakerLegendsController : Controller
{
string pathway1 = HostingEnvironment.MapPath(@"~/App_Data/Announcement1.txt");
string pathway2 = HostingEnvironment.MapPath(@"~/App_Data/Announcement2.txt");
string pathway3 = HostingEnvironment.MapPath(@"~/App_Data/Announcement3.txt");
private MoviesEntities db = new MoviesEntities();
public ActionResult Index()
{
// Setting some ViewBag texts from announcement files.
string text1 = System.IO.File.ReadAllText(pathway1);
ViewBag.TextHTML1 = text1;
string text2 = System.IO.File.ReadAllText(pathway2);
ViewBag.TextHTML2 = text2;
string text3 = System.IO.File.ReadAllText(pathway3);
ViewBag.TextHTML3 = text3;
// Following pulls some XML information
XDocument xmlFile = XDocument.Load(@"http://na.leagueoflegends.com/en/rss.xml");
var LoLtitles = from service in xmlFile.Descendants("item")
select …Run Code Online (Sandbox Code Playgroud) model-view-controller asp.net-mvc service-layer asp.net-mvc-5
我尝试按照有关 Spring MVC 的教程进行操作。教程中有UserDao接口(使用的是Spring Data JPA)
public interface UserDao extends JpaRepository<User, Long> {
User findByUsername(String username);
}
Run Code Online (Sandbox Code Playgroud)
还有 UserService 和 UserServiceImpl
public interface UserService {
void save(User user);
User findByUsername(String username);
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Autowired
private RoleDao roleDao;
@Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder;
@Override
public void save(User user) {
user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
Set<Role> roles = new HashSet<>();
roles.add(roleDao.getOne(1L));
user.setRoles(roles);
userDao.save(user);
}
@Override
public User findByUsername(String username) {
return userDao.findByUsername(username);
}
}
Run Code Online (Sandbox Code Playgroud)
我不久前问了一个类似的问题:使用数据映射器模式,实体(域对象)应该知道Mapper吗?但是,它是通用的,我真的很感兴趣如何用Doctrine2专门完成一些事情.
这里有一个简单的例子模型:每个Thing可以有Vote从User,一个User可投一个以上Vote,但只有最后Vote计数.因为其他数据(Msssage等)与之相关Vote,当Vote放置第二个数据时原始Vote不能只是更新,需要更换.
目前Thing有这个功能:
public function addVote($vote)
{
$vote->entity = $this;
}
Run Code Online (Sandbox Code Playgroud)
并Vote负责建立关系:
public function setThing(Model_Thing $thing)
{
$this->thing = $thing;
$thing->votes[] = $this;
}
Run Code Online (Sandbox Code Playgroud)
在我看来,确保User只有最后一次Vote计数是Thing应该确保的东西,而不是一些服务层.
所以要在模型中保留它,新Thing功能:
public function addVote($vote)
{
foreach($this->votes as $v){
if($v->user === $vote->user){
//remove vote
}
}
$vote->entity = …Run Code Online (Sandbox Code Playgroud) 我正在使用这种Service Layer --> Repository --> Entity Framework (Code-First) w/POCO objects方法,我很难更新实体.
我正在使用AutoMapper将我的域对象映射到我的View模型,这对于获取数据很有用,我怎么不把这些更改带回数据库?
使用纯POCO对象,我会假设没有任何类型的更改跟踪,所以我看到我唯一的选择是自己处理它.您是否确保您的View Models具有与Domain Objects完全相同的属性?如果我只在视图模型上更改一个或两个字段怎么办?域对象上的其余字段是否会被默认值覆盖在数据库中?
话虽如此,最好的方法是什么?
谢谢!
编辑
所以我磕磕绊绊的是这个,让我们举个简单的例子Customer:
1)Controller有一个服务,CustomerService调用服务GetCustmoerByID方法.
2)Service调用CustomerRepository并检索Customer对象.
3)Controller使用AutoMapper映射Customer到ViewModel.
4)Controller将模型交给View.一切都很棒!
现在,在视图中,您对客户进行了一些修改,并将其发回给控制器,以便将更改保留到数据库中.
我想在这一点上对象是分离的.那么模型是否应该具有与Customer对象完全相同的属性?你是否必须为你不想展示的每个项目制作隐藏的字段,以便它们可以坚持下去?
如何处理将对象保存回数据库?如果您的视图/模型仅处理对象上的几个字段会发生什么?
我正在寻找一种简单的方法(如果它存在)在ASP.NET MVC 3 Web应用程序中为指定的控制器和操作生成服务类中的URL.我想在服务层执行此操作,因为需要在QR代码中对此URL进行编码.
这在View或控制器中很简单,因为通过System.Web.Mvc可以使用UrlHelper,所以我可以在使用我的服务类的控制器操作中创建URL的开头,但我希望能够在QR码生成.
提前致谢.
我目前正在阅读很多关于设计模式的内容,我一直在看他们图书馆里的各种Pluralsight视频.到目前为止,我已经学到了以下内容:
现在我阅读了许多有关服务和服务层的内容,并希望获得一些关于阅读和了解这些内容的最佳位置的建议.我认为这适合领域驱动设计,我应该从那里开始?"服务"这个术语似乎在IT中被广泛使用,它可能会混淆确切的含义.
所以我的问题是:
我有一个 MVC 4 应用程序,它使用不同类库中的服务层。
对该服务层的一些调用需要知道哪些用户正在请求数据。
数据记录根据用户角色的不同而不同。
为了防止耦合问题,我应该在请求中传递用户名(HttpContext.User.Identity.Name)还是应该使用相同的 HttpContext.User.Identity.Name 在服务层上直接访问它。
我不确定是否应该从服务层隐藏 HttpContext。
model-view-controller asp.net-mvc separation-of-concerns service-layer asp.net-mvc-4
我维护一个Web应用程序,其中包含一个带有JSF标记的页面<f:event.我在服务类中重写了一个方法,以便抛出一个业务异常.但是,当抛出业务异常时,它不会被托管bean捕获,并且页面上会显示异常.似乎我的代码try/catch不起作用.
在XHTML中:
<f:event listener="#{resourceBean.init(enrollment)}" type="preRenderView" />
Run Code Online (Sandbox Code Playgroud)
Managed Bean中的监听器方法:
private boolean canCreateResource;
public void init(Enrollment enrollment) {
(...)
try {
canCreateResource = resourceService.canCreateResource(enrollment);
} catch (BusinessException e) {
canCreateResource = false;
}
}
Run Code Online (Sandbox Code Playgroud)
服务类中的方法:
public boolean canCreateResource(Enrollment enrollment) {
if (...) {
if (mandateService.isCoordinator(user, course)) {
return true;
} else {
throw new BusinessException("Undefined business rule.");
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
从我在其他网站上看到的内容,我想我必须实现一些JSF的处理程序类.但是哪个以及如何?
EDITED
OBS 1:BusinessException该类扩展了RuntimeException类.
OBS 2:canCreateResource创建属性以控制按钮的渲染.
service-layer ×10
asp.net-mvc ×3
c# ×1
datamapper ×1
doctrine-orm ×1
ejb ×1
java ×1
java-ee ×1
jsf ×1
poco ×1
spring ×1
spring-mvc ×1
transactions ×1
url ×1