我正在使用标准的mvc范例编写一个zend框架应用程序,并添加了一个服务层来处理应用程序/业务逻辑.将访问控制放入您的服务而不是模块/控制器/操作似乎非常流行,但是,我只看到了具有这些角色的静态角色和权限的简单示例.
我的应用程序将使用动态acl,允许管理员用户添加角色并设置这些角色的权限.我有两个问题:
任何帮助将不胜感激.
假设我有用于用户注册的RegisterModel和一些实现IUserService的UserService
public interface IUserService
{
User CreateUser(User newUser);
}
[HttpPost]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// ... logic for newuser
User user = _userService.CreateUser(newuser);
_authenticationService.SetAuthenticatedUser(user);
return RedirectToRoute("Homepage");
}
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
鉴于RegisterModel可能非常复杂,逻辑应该用于将RegisterModel映射到User对象
是否有一种简单的方法可以将"服务层"与Web层分开部署,这样我就可以减少每周必须包装,打包,构建和部署整个WAR文件的次数?
我主要使用Tomcat,但我希望Java Web服务器更通用.
我正在整合Zend Framework和Doctrine 2,我正在发现服务层.
现在我明白了(我错了吗?)我有2种架构可能:
每个的优点/缺点是什么?
通过将域逻辑放在模型外部来丢失OOP对我来说似乎很奇怪,所以我不明白为什么要使用服务层.
多年来,我一直在重复实现相同的代码(使用进化)而没有找到一些干净,有效,抽象出来的方法.
该模式是我的服务层中的基本'find [Type] s'方法,它将选择查询创建抽象到服务中的单个点,但支持快速创建更易于使用的代理方法的能力(请参阅示例PostServivce :: getPostById ()方法如下).
不幸的是,到目前为止,我一直无法满足这些目标:
我最近的实现通常类似于以下示例.该方法采用一系列条件和一组选项,并从中创建并执行Doctrine_Query(我今天在这里大部分重写了这一点,因此可能存在一些拼写错误/语法错误,它不是直接剪切和粘贴).
class PostService
{
/* ... */
/**
* Return a set of Posts
*
* @param Array $conditions Optional. An array of conditions in the format
* array('condition1' => 'value', ...)
* @param Array $options Optional. An array of options
* @return Array An array of post objects or false if no matches for conditions
*/
public function getPosts($conditions = array(), $options = array()) {
$defaultOptions = = …Run Code Online (Sandbox Code Playgroud) 我有一个MVC项目,我使用AutoMapper将我的实体框架实体映射到View Models.定义映射的代码位于boostrapper类中,该类在应用程序启动时自动调用(App_Start,Global.asax)
我正在对我的代码进行一些重构,以将我的所有业务逻辑放在服务层中,因为我们需要实现一个每天运行的批处理过程,该过程与MVC应用程序执行一些相同的逻辑.
我遇到的一个问题是现在我需要将我的数据库实体映射到服务层中的某些域对象.我认为在MVC应用程序中一切都会正常工作,因为仍在Global.asax中调用引导程序.
有没有办法让我的映射代码适用于我的MVC应用程序和另一个非MVC应用程序(可能是WCF服务,控制台应用程序等).我在哪里可以放置这个映射代码,以便它可以被两个应用程序调用只有一次?
假设我的服务层中有两个服务,ServiceA并且ServiceB每个都有一个接口(IServiceA和IServiceB分别)。
UI 层仅引用从其方法返回DTO的服务接口。具体的服务类负责将域模型 (EF POCO) 映射到 DTO。
ServiceA需要的依赖关系IServiceB通过依赖注入使用IoC容器中,为了调用该服务的一些方法。
这样做有几个问题:
与 DTO 之间的不必要/重复映射只是为了调用方法和/或使用结果。
将调用方法与被调用方法的输入参数和返回类型的 DTO 契约紧密耦合。
最初我想将逻辑重构为一个内部方法并从两个服务中调用它。但是,由于ServiceA依赖于接口IServiceB,因此不会公开内部方法。
你会如何处理这个问题?
更多信息(根据要求添加示例代码):
// This is the domain model
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
}
// This is a dto for the domain model
public class CustomerDto
{
public string Name { get; set; …Run Code Online (Sandbox Code Playgroud) 我在项目中使用服务层跟踪存储库模式.对于每个视图,我将创建一个viewmodel.
我感到困惑的是,服务层应该直接访问域对象并将它们返回给控制器,还是应该使用DTO.如果我应该使用DTO,将它们放在项目架构中的哪个位置?
谢谢.
我有一些模特课
public class Account {
@Email
private String email;
@NotNull
private String rule;
}
Run Code Online (Sandbox Code Playgroud)
和弹簧验证器
public class AccountValidator implements Validator {
@Override
public boolean supports(Class aClass) {
return Account.class.equals(aClass);
}
@Override
public void validate(Object obj, Errors errors) {
Account account = (Account) obj;
ValidationUtils.rejectIfEmpty(errors, "email", "email.required");
ValidationUtils.rejectIfEmpty(errors, "rule", "rule.required");
complexValidateRule(account.getRule(), errors);
}
private void complexValidateRule(String rule, Errors errors) {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
我在我的服务中运行
AccountValidator validator = new AccountValidator();
Errors errors = new BeanPropertyBindingResult(account, "account");
validator.validate(account, errors);
Run Code Online (Sandbox Code Playgroud)
我可以在验证过程中添加约束@Email,@ NotNull(JSR-303)并且不在AccountValidator中描述这些规则吗?
我知道Spring控制器中的@Valid是如何工作的,但服务层是什么?可能吗?如何以适当的方式进行此类验证?我可以使用Hibernate …
我正在尝试更具体地了解 MVC 并保持控制器层尽可能薄。
我一直问自己的一件事是“我应该在哪里调用 modelname->save()?”
查看 Laravel 文档,他们将数据设置为模型并在控制器中调用 save ,这似乎不正确......
<?php
namespace App\Http\Controllers;
use App\Flight;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class FlightController extends Controller
{
public function store(Request $request)
{
// Validate the request...
$flight = new Flight;
$flight->name = $request->name;
$flight->save();
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个非常简单的示例,这可能就是他们在控制器中完成所有操作的原因。
根据我的理解和我一直在阅读的所有内容,所有业务逻辑都应该位于模型内部,控制器负责视图和模型之间的“流量控制”。
那么我会在模型本身内部调用 save 吗?还是应该使用服务层?
这是我当前的示例数据问题。
我正在更新模型的状态。该行已存在于数据库中。我使用 PATCH /route/ 来访问控制器方法。从那里我得到了模型。
class TimecardController extends Controller {
...
public function markAsPass(Request $request, $id) {
$test = Test::findOrFail($id);
//I don't think this is the corect way
//$test->status = "passed";
//$test->markedBy …Run Code Online (Sandbox Code Playgroud) service-layer ×10
asp.net-mvc ×3
architecture ×2
doctrine-orm ×2
dto ×2
php ×2
spring ×2
acl ×1
automapper ×1
c# ×1
java ×1
laravel ×1
updating ×1
zend-acl ×1