小编Bob*_*bor的帖子

何处在DDD +分层架构中实现Automapper

背景:为了我自己的清晰度/自我教育,我试图使用TDD + DDD实现一个简单的订单输入应用程序.我的主要目标是通过分离问题来保持架构的清洁.

我有四层(现在)......

  1. 具有CustomerRepository类的Persistence/DAL,可以对"聚合根",客户及其相关订单和OrderItem执行GetById,Save,操作.为了让"穷人的依赖注入"

  2. 包含"业务实体"类的域/ BLL层,执行细粒度操作以帮助创建新订单,根据订单大小和客户位置应用税,折扣,装运逻辑.

  3. 应用程序Facade(应用程序服务/编排)包含大块,粗粒度的类来编排"业务实体"并减少与表示(可能是WebServices层)的聊天.

  4. 表示层

此外,我想在关键层之间传递POCO DTO ...特别是在Persistence => Domain层和ApplicationFacade => Presentation层之间.因此,我有CustomerDto,OrderDto,OrderItemDto以及在共享包中定义的适当关系.

我想使用Constructor Injection将ICustomerRepository的实现注入到Customer"业务实体"类中,然后在"业务实体"上调用Customer.Save()以启动创建/更新过程,最终调用Save方法CustomerRepository.毕竟,客户是"聚合根"并拥有保存所需的所有信息......它也是注入的CustomerRepository的"守护者".

问题: 这是我遇到麻烦的地方.我想保持Domain/BLL Layer尽可能纯,并避免将其耦合到任何第三方框架和API, Customer.Save()方法需要将Customer"聚合根"及其所有Orders和OrderItems转换为他们的DTO版本用于传输到注入的持久层CustomerRepository ...这是Automapper的工作.

问题是......如果我不把Automapper在域/ BLL层,我真的不知道哪里应该去.

将它放在ApplicationFacade中感觉不对,即使它的工作是编排.

把它放在Domain/BLL层中肯定是不对的,因为我想让它保持原始状态.

因此,我觉得我已经错过了一些东西......我正在接近这一点,因为他们对工作部分应该如何共同完成这项任务有着根本的误解.有什么建议?(请保持温和,我对这一切都是新手,对SO来说是新手.如果我需要展示一些我到目前为止的代码,请告诉我.)

architecture domain-driven-design layer automapper

23
推荐指数
1
解决办法
6292
查看次数

在分层体系结构中为存储库定义接口的位置?

背景

我正在尝试创建一个简单的应用程序来真正理解整个DDD + TDD +等堆栈.我的目标是在运行时动态注入DAL存储库类.这使我的域和应用程序服务层可以测试.我计划使用"穷人的DI"来实现这一目标...所以我会在启动附近的一个简单的控制台应用程序中执行此操作:


    // Poor man's DI, injecting DAL repository classes at runtime
    var productRepository = new SimpleOrder.Repository.ProductRespository();
    var customerRepository = new SimpleOrder.Repository.CustomerRepository();
    var orderRepository = new SimpleOrder.Repository.OrderRepository();

    // Constructor injection into this class in the Application Services layer,
    // SimpleOrder.ApplicationFacade
    OrderEntry oe = new OrderEntry(customerRepository, orderRepository, productRepository);

为了实现这种依赖注入,我创建了三个存储库接口:

-- ICustomerRepository
-- IOrderRepository
-- IProductRespository

一个典型的实现:


    namespace SimpleOrder.Domain.Interfaces
    {
        public interface ICustomerRepository
        {
            Customer GetCustomerById(int customerId);
            void SaveCustomer(Customer customer);
        }
    }

**请注意,SaveCustomer引用了域层中定义的Customer模型类.这是其他存储库的典型.

但是我不确定应该在哪个项目/层实施.我在解决方案中有5个项目:

  1. SimpleOrder.ConsoleClient(presentation) - 我想从这里注入域的特定实现作为应用程序

  2. SimpleOrder.ApplicationFacade(应用程序服务) - …

domain-driven-design interface ddd-repositories layer n-tier-architecture

12
推荐指数
1
解决办法
5742
查看次数

FakeItEasy说MustHaveHappened并没有发生......但确实如此

我正在尝试对"服务层"/"应用程序外观层"方法进行单元测试.这是我试图进行单元测试的方法:

// Create a new order in the database for a customer.  Given a customer id,
// will create a new order and return an OrderDto for use in the presentation
// layer.
public OrderDto CreateOrderForCustomer(int customerId)
{
  // Find the customer
  var customer = _customerRepository.GetCustomerById(customerId);

  // Create an order and apply special logic to get it ready for use.
  var orderFactory = new OrderFactory();
  var order = orderFactory.CreateOrder(customer);

  // IMPORTANT: This is what I'm trying to unit test ... …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing mocking fakeiteasy

7
推荐指数
1
解决办法
3214
查看次数

使用x:在UWP中的GridView的ItemTemplate布局用户控件中绑定

在通用Windows平台API中,如何使用x:绑定用户控件(旨在成为GridView的ItemTemplate的布局)来绑定到GridView的ItemSource的实例属性?

背景

我正在尝试重新创建Windows 10股票应用程序中的布局,如体育,新闻,金钱等.

我正在使用两个GridViews作为应用程序的主要区域; 一个用于"特色文章"(2张带有标题的大照片)和一张用于所有其他文章(带有标题的较小照片).

我能够绑定到我在后面的代码中提供的数据源(一个List,其中NewsItem是一个带有Image和Headline属性的POCO)以下是MainPage.xaml的相关部分:

<Page ...
   xmlns:data="using:NewsApp.Models" />

.... 

<GridView Name="FeaturedItems" Grid.Row="0">
  <GridView.ItemTemplate>
    <DataTemplate x:DataType="data:NewsItem">
      <Grid Name="mainPanel" HorizontalAlignment="Stretch" Width="500" >
        <Image Source="{x:Bind Image}" HorizontalAlignment="Stretch" />
        <TextBlock Text="{x:Bind Headline}" />
      </Grid>
    </DataTemplate>
  </GridView.ItemTemplate>
</GridView>

....
Run Code Online (Sandbox Code Playgroud)

图像和标题绑定得很好(即使它们没有正确设置样式).但是,相反我认为我需要绑定到用户控件以获取我想要的样式选项,控制调整大小esp.当使用视觉状态触发器并简化XAML时(至少,这是我建议的技术).

所以,我在项目中添加了一个新的用户控件(FeaturedItemControl.xaml),并复制到DataTemplate的子Grid中:

<UserControl ... >
  <Grid Name="mainPanel" HorizontalAlignment="Stretch" Width="500" >
    <Image Source="{x:Bind Image}" HorizontalAlignment="Stretch" />
    <TextBlock Text="{x:Bind Headline}" />
  </Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)

然后回到MainPage.xaml,我更改DataTemplate以引用新的FeaturedItemControl:

<GridView Name="FeaturedItems" Grid.Row="0">
  <GridView.ItemTemplate>
    <DataTemplate x:DataType="data:NewsItem">
      <local:FeaturedItemControl HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
    </DataTemplate>
  </GridView.ItemTemplate>
</GridView>
Run Code Online (Sandbox Code Playgroud)

但是,我收到了Image和Headline属性的错误消息:无效的绑定路径'Headline':在'FeaturedItemControl'类型上找不到属性'Headline'.

我已经尝试了一些东西,但是在我不知道自己在做什么的情况下只是抛出代码来解决问题.任何帮助将不胜感激.

谢谢你的关注.

xaml gridview uwp

4
推荐指数
2
解决办法
6438
查看次数

通过.Net Core Console应用程序从Entity Framework Core 1.x连接到localdb

如何在Visual Studio中使用.NET Core 1.x控制台应用程序中的Entity Framework Core 1.x?我已经尝试过我从ASP.NET MVC Core 1.x开发中使用的工作流程和命令,并且我遇到了与localdb的连接错误.

如何在控制台应用程序中使用localdb与在ASP.NET MVC Core 1.x应用程序中工作不同?

背景

几次成功使用ASP.NET MVC Core 1.x和Entity Framework Core 1.x之后,我需要创建一个简单的.NET Core Console应用程序来完成一些繁重的工作(将XML加载到新数据库中,创建与松散匹配的表格XML的结构).

我用NuGet安装

  • Microsoft.EntityFrameworkCore.Design(1.1.2)
  • Microsoft.EntityFrameworkCore.SqlServer(1.1.2)
  • Microsoft.EntityFrameworkCore.Tools(1.1.1)

我用DbSets创建了一个DbContext.我添加了一个OnConfiguring()方法并对连接字符串进行了硬编码,就像我在网上的代码示例中找到的一样.我的DbContext看起来像这样:

public class ApplicationDbContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(@"Server=(localdb)\\mssqllocaldb;Database=MyXmlExport;Trusted_Connection=True;MultipleActiveResultSets=true");
    }

    public DbSet<Author> Authors { get; set; }
    public DbSet<Thread> Threads { get; set; }
    public DbSet<Post> Posts { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我从一个有效的ASP.NET MVC Core 1.x应用程序的appsettings.json中获取连接字符串,将数据库名称更改为简单的名称("MyXmlExport").

我能够创建一个初始迁移.

当我尝试使用我习惯的工作流程时,即调用:

update-database
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

"建立与SQL Server的连接时发生与网络相关或特定于实例的错误.未找到服务器或无法访问服务器.验证实例名称是否正确以及SQL Server是否配置为允许远程连接.(提供程序: SQL网络接口,错误:50 - 发生本地数据库运行时错误.指定的LocalDB实例名称无效."

我可以通过Sql …

c# entity-framework-core visual-studio-2017

3
推荐指数
1
解决办法
2181
查看次数