背景:为了我自己的清晰度/自我教育,我试图使用TDD + DDD实现一个简单的订单输入应用程序.我的主要目标是通过分离问题来保持架构的清洁.
我有四层(现在)......
具有CustomerRepository类的Persistence/DAL,可以对"聚合根",客户及其相关订单和OrderItem执行GetById,Save,操作.为了让"穷人的依赖注入"
包含"业务实体"类的域/ BLL层,执行细粒度操作以帮助创建新订单,根据订单大小和客户位置应用税,折扣,装运逻辑.
应用程序Facade(应用程序服务/编排)包含大块,粗粒度的类来编排"业务实体"并减少与表示(可能是WebServices层)的聊天.
表示层
此外,我想在关键层之间传递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来说是新手.如果我需要展示一些我到目前为止的代码,请告诉我.)
背景
我正在尝试创建一个简单的应用程序来真正理解整个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个项目:
SimpleOrder.ConsoleClient(presentation) - 我想从这里注入域的特定实现作为应用程序
SimpleOrder.ApplicationFacade(应用程序服务) - …
domain-driven-design interface ddd-repositories layer n-tier-architecture
我正在尝试对"服务层"/"应用程序外观层"方法进行单元测试.这是我试图进行单元测试的方法:
// 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) 在通用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'.
我已经尝试了一些东西,但是在我不知道自己在做什么的情况下只是抛出代码来解决问题.任何帮助将不胜感激.
谢谢你的关注.
如何在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安装
我用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# ×2
layer ×2
architecture ×1
automapper ×1
fakeiteasy ×1
gridview ×1
interface ×1
mocking ×1
unit-testing ×1
uwp ×1
xaml ×1