Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 带服务的MVC存储库模式-如何获取DAL上的错误?_Asp.net Mvc_Entity Framework_Repository Pattern - Fatal编程技术网

Asp.net mvc 带服务的MVC存储库模式-如何获取DAL上的错误?

Asp.net mvc 带服务的MVC存储库模式-如何获取DAL上的错误?,asp.net-mvc,entity-framework,repository-pattern,Asp.net Mvc,Entity Framework,Repository Pattern,因此,我的服务中有一个方法,我将从控制器调用该方法: public void SendMessage(Message message) { message.Property = "Random"; try { // try some insert logic } catch (Exception) { // if it fails undo some stuff

因此,我的服务中有一个方法,我将从控制器调用该方法:

public void SendMessage(Message message) {
        message.Property = "Random";
        try { 
            // try some insert logic
        }
        catch (Exception) {
            // if it fails undo some stuff
            // return the errors 
            throw;
        }

        // if there are no errors on the return the operation was a success
        // but how do I get the Service generated data?
    }
编辑:

因此,问题并不是让我的代码正常工作,而是我在使用服务层作为DAL演示之间通信的“中间人”时遇到的存储库模式的问题

因此,我有一个单独的程序集,名为
DataLibrary

DataLibrary
有我的模型(
Message
)、我的存储库和服务(
MessageService

在我的MVC站点中,我通常会有一个带有CRUD功能的控制器。它看起来像这样:

public ActionResult Create(Message message) {
    if(ModelState.IsValid) {
        db.insert(message);
    }
    Return View(message);
}
//AService service method
public AnEntity ServiceMethod(AFilterViewModel aFilter)
{
     //do some validation
     try
     {
          //some transactional operations
     }
     catch
     {
          //do some log and rollback it... 
          throw;
     }
     var anEntity = _aRepository.GetSomeEntity(x=> x.Something == aFilter.Something);
     return anEntity;
}

//controller method
public ActionResult GetSomething(AFilterViewModel aFilter)
{
     try
     {
          var entity = _aService.ServiceMethod(aFilter);
          AViewModel model = MapToView(entity);
          return View(model);
     }
     catch
     {
          return RedirectToAction("Error");
     }
}
但通过使用Repository模式,使用服务层进行通信,我得到了以下结果:

public ActionResult Create(MessageCreateModel message) {
    if(ModelState.IsValid) {
        MessageService.SendMessage(message.ToDTO());
    }
    Return View(message);
}
我如何知道手术成功或失败,原因是什么

如何在执行上述操作的同时从服务的业务逻辑中检索填充的数据


我如何在尽可能接近MVC设计模式/扩展性关注点的同时实现上述两个目标?

您确实没有提供足够的架构信息来回答这个问题。但是,如果您想从
SendMessage
方法中获取一个值,那么添加一个返回值而不是
void
是一个很好的开始。

首先,如果只是将工作委托给存储库,为什么要使用as-service?如果您已经正确地实现了存储库(即作为一个完整的抽象),那么就没有必要使用该服务。只需直接从控制器调用存储库。您可以在my中阅读有关存储库模式的更多信息

但这并不能真正解决问题

那么如何处理错误呢?当涉及到异常时:;)而不是你通常可以处理的事情,以交付预期的结果

正如我们所说的数据层,它通常意味着一个稳定的数据库引擎,在这个引擎中,读/写操作有望成功。因此,除了使用异常之外,不需要任何其他错误处理

在ASP.NET MVC中,您可以使用属性处理事务,并使用try/catch填充模型状态,如图所示:


我认为您应该首先决定如何设计您的体系结构。您是否使用面向服务的方法,如果是这样,您的服务方法必须为通知控制器返回一些内容。因此,将您的服务层视为一个国家的边界,而另一个国家的边界是控制器。你必须让这两个国家进行贸易。这可以通过包含返回数据和服务错误等的返回对象来完成

如果您只想将一些业务逻辑放入服务层,那么您可能不需要独立的层。只要松耦合就足够了。因此,您可以返回基本clr对象、域对象或应用程序对象。在这样一个非常基本的例子中:

public ActionResult Create(Message message) {
    if(ModelState.IsValid) {
        db.insert(message);
    }
    Return View(message);
}
//AService service method
public AnEntity ServiceMethod(AFilterViewModel aFilter)
{
     //do some validation
     try
     {
          //some transactional operations
     }
     catch
     {
          //do some log and rollback it... 
          throw;
     }
     var anEntity = _aRepository.GetSomeEntity(x=> x.Something == aFilter.Something);
     return anEntity;
}

//controller method
public ActionResult GetSomething(AFilterViewModel aFilter)
{
     try
     {
          var entity = _aService.ServiceMethod(aFilter);
          AViewModel model = MapToView(entity);
          return View(model);
     }
     catch
     {
          return RedirectToAction("Error");
     }
}
如上所述,控制器和服务层方法可以共享彼此的对象。它们彼此之间有边界,并且相互耦合。但您的体系结构决定了它们的耦合程度


您也可以仅以一种方式进行这些映射。类似于“仅服务于控制器”或“仅控制器于服务”。若您不想在服务层中使用viewmodel,则应始终在服务层中进行映射。否则,请在控制器中执行对象映射。另外,别忘了将viewmodel放入另一个库中,这非常重要。这些类似于“价值对象”。

只是澄清一下,服务层、repo和dto被包装在一个单独的组件中。哈哈。回答很好。我在寻找一点理论,然后我就可以开始研究了。我希望我的编辑能让我明白我在寻找什么。我读了你的博客文章,我有一个与第一张海报相似的问题。我认为业务逻辑应该进入服务层,因为我需要在一个地方(而不是控制器)使用对各种模型/repo的引用。如果我改为插入一个用户,我如何返回一个“用户已经存在错误”?现在完全有意义了,我为响应晚表示歉意。如果有效,则返回对象,否则我可以在内部抛出并捕获我自己的错误,并对此进行验证:)