Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.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
C# MVC洋葱架构,一些问题_C#_Asp.net Mvc_Asp.net Web Api_N Tier Architecture_Onion Architecture - Fatal编程技术网

C# MVC洋葱架构,一些问题

C# MVC洋葱架构,一些问题,c#,asp.net-mvc,asp.net-web-api,n-tier-architecture,onion-architecture,C#,Asp.net Mvc,Asp.net Web Api,N Tier Architecture,Onion Architecture,我正在使用Asp.NETMVC5、WebAPI2和实体框架创建一个项目。我用洋葱架构设计它,所以我有DAL、服务和UI层 我的DAL层包含一个工作和存储库单元,我的服务层包含用于业务案例的服务 但我有以下问题: 在哪里使用工作单元保存(或提交)方法?,在服务层还是在UI层? 如果我在服务层使用它,我如何处理跨越多个服务的情况 我使用DTO进行webapi操作,服务层应该返回DTO还是应该在UI层进行映射 DTO应该在单独的项目中还是在UI项目中?如果它们在单独的项目中,我应该使用MVC属性进行验

我正在使用Asp.NETMVC5、WebAPI2和实体框架创建一个项目。我用洋葱架构设计它,所以我有DAL、服务和UI层

我的DAL层包含一个工作和存储库单元,我的服务层包含用于业务案例的服务

但我有以下问题:

  • 在哪里使用工作单元保存(或提交)方法?,在服务层还是在UI层? 如果我在服务层使用它,我如何处理跨越多个服务的情况

  • 我使用DTO进行webapi操作,服务层应该返回DTO还是应该在UI层进行映射

  • DTO应该在单独的项目中还是在UI项目中?如果它们在单独的项目中,我应该使用MVC属性进行验证吗


  • 您的工作单元应该存在于您的服务层中。对服务的每个调用都包含单个工作单元内的一个业务事务

        public ServiceResponse<Patient> Save(Patient patient, string userName)
        {
            Func<Patient> func = delegate
            {
                Authorize(patient, userName);
                Validate(patient, new PatientValidator());
    
                using (var context = _contextFactory())
                {
                    return context.Save(patient, userName);
                }
            };
            return this.Execute(func);
        }
    
    公共服务响应保存(患者,字符串用户名)
    {
    Func Func=委托
    {
    授权(患者、用户名);
    验证(患者、新患者验证器());
    使用(var context=_contextFactory())
    {
    返回context.Save(患者、用户名);
    }
    };
    返回此.Execute(func);
    }
    
    服务层应该返回您的业务实体,任何用于网络通信/json格式的映射都应该在web api中完成。这允许最大限度地重用您的服务

    如果DTO引用的是用于跨线/json序列化的对象,那么它们应该与Web Api位于同一个项目中。这可能与您的UI所在的项目相同,也可能不同。如果您使用Web Api,我建议您使用类似FluentValidation的验证库


    洋葱架构的一个例子是使用C#、EF、Web Api,EF之上的存储库是不好的,Mkaaay?@Sippy如果您曾经让一位经理/架构师在项目中期改变他/她的想法,了解您的数据访问技术,那么您就知道在数据访问框架上有一个抽象层的价值。所以,不,如果EF(或任何ORM)上的存储库封装了ORM,那么它们也不错。@Sippy不错,大多数时候都不需要,但我确实需要抽象所有实体框架实现,正如BrianDriscoll所说,最终可能会有数据访问更改。@BrianDriscoll同意。我经常创建相同的东西,以便在Mongodb和SQLAzure之间交换。我认为Sippy可能指的是每种类型存储库模式的糟糕做法。也许是对问题1的一个提示,在DDD(域驱动设计)中,您区分了应用程序服务和域服务。应用程序服务将表示单个用例,而域服务表示对域模型的操作。在此空间中,工作单元通常在应用程序服务中进行管理,该服务可以组成多个域服务,以在应用程序中实现给定的用例。谢谢,还有一个问题,为什么要将所有save函数包装在一个委托中?这样我就可以对所有方法进行一次try…catch并返回一个标准格式的响应对象。它使来自客户机(如WebApi)的调用更加清晰,并且您可以使用常用方法处理响应。在这个尝试中,catch也可以被记录。由于所有操作都发生在该方法中,所有错误都将被捕获、记录和处理@我不同意这一点。有单独的模型不是必需的b/c您可以按任何方式对域进行建模,EF将负责映射细节。不应存在阻抗失配。