我是软件开发的新手.我个人认为,分层体系结构是一种很好的方法,可以减少面向对象方法中软件开发过程中出现的复杂性,更不用说保持代码的有序性.现在,我遇到了一些DDD(Domain Driven Design)引入的问题.当然,初级水平的.
这就是 -
让我们说,我想构建一个应用程序来保存数据库中的"人"相关数据,并在wpf数据网格中显示人员详细信息(DDD绝对不适用于这种规模的应用程序,但只是为了简化像我一样的业余爱好者).所以,我设计了一个域类"Person",类似于 -
public class Person
{
public Person(dataType paramA)
{
this.PropertyA = paramA;
}
private dataType _fieldA;
public dataType PropertyA
{
//encapsulates _fieldA
}
public dataType PropertyX
{
//some code that manipulates private field
}
private dataType MethodPQR(dataType param)
{
//some code
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我对DDD的理解说,架构(最简单的版本)应该如下(如果我错了,请纠正我) -
注意:
我希望datagrid绑定到一些ObservableCollection,只是为了立即反映任何类型的更改.
它是一个wpf应用程序,但不一定是MVVM模式,我故意想使用后面的代码(我不知道后面的代码本身是代表应用程序层)
所以我的问题是 -
什么样的代码应该属于应用层?
我的猜测是,我绝对不应该将我的域对象(Person)的ObservableColletion绑定为datagrid的itmsSource.那么我应该从域对象中提取什么类型的对象,以及如何?
为了保持表示层对象和域层对象之间的解耦,可能存在类似的约定DataGrid
.那么非"直接"方法是什么?
如果Code-Behind与应用层进行对话,那么应用层应该与存储库进行通信吗?但是,如果需要某种类型的域访问而不是与数据访问相关(可能不在此应用程序中,但它可能会发生,对吧?),应用层应该与哪个域人员层中的X人进行对话?
我知道我所有的问题和问题都是非常业余的.但它们确实是问题和问题.所以,如果有人有时间,任何回复都将受到赞赏.
编辑:我不确定Data Repository是否应该有域模型的引用.
domain-driven-design code-organization repository project-organization layer
我有一个.NET 4.0 WPF解决方案,其中包含一个单元测试项目,用于测试视图模型中使用的不同命令.一切都很好.然后我安装了.NET framework 4.5然后安装了VS2012,并开始收到如下错误消息 -
XYZProject.UsersViewModel_Accessor.AddUserToAccountsCommand' is not supported by the language
在安装VS2012之前UnitTestFramework.dll
,引用了 -
C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies\
被改为引用 -
C:\Program Files\Microsoft Visual Studio 11.0\Common7\IDE\ReferenceAssemblies\v4.0
所以它从VS2012中获取了引用,我手动恢复了该引用.但没有运气.
这AddUserToAccountsCommand
是一个ICommand
驻留在PresentationCore.dll
.NET 4.0中的对象,但是System.dll
在.NET 4.5中.所以我也检查了这些参考文献,它们似乎就像以前一样.
错误消息仅显示创建测试目标的位置,如Access,例如UsersViewModel_Accessor
,表示以下代码生成错误 -
UsersViewModel_Accessor target = new UsersViewModel_Accessor();
Assert.IsTrue(target.AddUserToAccountsCommand.CanExecute(null), "Failed to perform can exetuce of add user command");
target.AddUserToAccountsCommand.Execute(null);
Run Code Online (Sandbox Code Playgroud)
但如果使用viewmodel类型直接创建测试目标,如下所示 -
UsersViewModel target = new UsersViewModel();
Assert.IsTrue(target.AddUserToAccountsCommand.CanExecute(null), "Failed to perform can exetuce of add user command");
target.AddUserToAccountsCommand.Execute(null);
Run Code Online (Sandbox Code Playgroud)
没有错误发生,项目构建成功.那么,有人可以分享任何想法吗? …
我在测试或测试自动化方面非常陌生.现在我最近被分配到一个自动化UIF测试WPF应用程序的项目.在对MSDN和其他人进行一些搜索之后,我对是否应该使用Microsoft UI自动化库或VS 2010的新编码UI测试功能感到有点困惑.我没有清楚地了解这些适用于哪一个在哪些情况下,一个人有什么优势,另一个适合我(再一次,我有一个像WPF应用程序的CAD,错过了很多AutomationIds,我必须自动化其ui测试).请帮忙 !!!
在做了一些搜索之后,我开始意识到我应该使用Flex-Layout库来使 Material-themed UI 具有响应性(如这里的回答)。根据文档,该库提供了MediaObserver
以编程方式检测媒体查询激活的类。
我使用了材料原理图命令 -
ng g @angular/material:navigation shell/layout
Run Code Online (Sandbox Code Playgroud)
添加一个Sidenav
组件,并注意到以下生成的代码 -
ng g @angular/material:navigation shell/layout
Run Code Online (Sandbox Code Playgroud)
它使用BreakpointObserver
类并Breakpoints
从@angular/cdk/layout
包中预定义来检测视口更改。和文档说-
布局包提供实用程序来构建响应屏幕尺寸变化的响应式 UI。
因此,显然,有两个不同的库可用于使 Material 主题的 UI 响应,并且它们使用不同的方法。(如果我错了,请纠正我)。
我想知道 -
MediaObserver
使用BreakpointObserver
?@angular/cdk/layout
完全避免使用实用程序吗?在这方面是否有一些最佳实践可以遵循?编辑:2020.05.11
根据 的源代码MediaObserver
,它不使用底层BreakpointObserver
。它使用本机Window.matchMedia()
API。
media-queries responsive-design angular-material angular angular-cdk
我有用户实体
public class User
{
public int UserId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public ICollection<Technology> Technologies { get; set; } = new List<Technology>();
}
Run Code Online (Sandbox Code Playgroud)
我有技术实体
public class Technology
{
public int TechnologyId { get; set; }
public string TitleTechnology { get; set; }
public int GroupId { get; set; }
public Group Group …
Run Code Online (Sandbox Code Playgroud) 使用System.Windows.Automation(通常称为UIA)API和Microsoft.VisualStudio.TestTools.UITesting(在场景后面的Coded UI Test中使用的API)以编程方式实现WPF应用程序的UI测试自动化有什么区别?
是否有任何特定的场景,限制或优点/缺点?
考虑类的ConfigureServices
方法中的以下代码Startup
-
services.AddTransient<IAuthorizationHandler, BlockUsersHandler>();
services.AddTransient<IAuthorizationHandler, BlockClaimHandler>();
services.AddAuthorization(option =>
{
option.AddPolicy("NotHacker", policy =>
{
policy.AddRequirements(new BlockUsersRequirement("Hacker"));
});
option.AddPolicy("NotThatClaim", policy =>
{
policy.AddRequirements(new BlockClaimRequirement(new Claim("ThatClaimType", "ThatClaim")));
});
});
Run Code Online (Sandbox Code Playgroud)
这些是自定义类实现 -
public class BlockUsersRequirement : IAuthorizationRequirement
{
// Code goes here
}
public class BlockUsersHandler : AuthorizationHandler<BlockUsersRequirement>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, BlockUsersRequirement requirement)
{
// Code goes here
}
}
public class BlockClaimRequirement : IAuthorizationRequirement
{
// Code goes here
}
public class BlockClaimHandler : AuthorizationHandler<BlockClaimRequirement>
{
protected …
Run Code Online (Sandbox Code Playgroud) 在 Visual Studio 2019 中,如果我尝试创建 ASP.NET Core Web 应用程序项目,我将在以下屏幕中选择框架版本 -
但是,当我尝试创建一个 .NET Core 类库项目时,系统会提示我以下屏幕,该屏幕不提供任何用于选择框架版本的选项 -
单击“创建”按钮始终会使用安装在我机器上的最新 .NET Core 版本立即创建项目。
那么,如何在创建类库项目时选择框架版本呢?还是每次创建后都必须手动更改它?
我已经开始研究使用 Identity 框架的现有 ASP.NET Core 项目。该应用程序使用单个数据库。出于某种原因,应用程序使用两个单独的数据库上下文 - 一个派生自IdentityDbContext
当然用于管理用户/身份验证,另一个派生自DbContext
其用于除用户相关业务之外的任何事情。
我以前见过使用两个单独的数据库上下文的应用程序,但每次它们通过IdentityDbContext
. 也许以前的开发人员试图实现我不清楚的东西。
那么,在我使用两个单独的上下文而应用程序具有单个数据库的场景中,我可能缺少哪些可能的优势?谢谢。
编辑:
我的理解是,由于我只有一个数据库,因此我可以轻松地只使用 ,IdentityDbContext
并且它可以满足当前两个单独的上下文组合所服务的每个目的。该应用程序具有各种业务实体(比如员工、客户、供应商等),这些实体不User
属于该应用程序,但可以在未来某个时间点通过使用基于角色的各个级别的权限进行注册来使其成为一个。在这种情况下,仅使用IdentityDbContext
给了我与AspNetUsers
表创建一对一关系的优势,我现在无法仅仅因为单独的上下文而实现。
我学会了如何使用流畅的验证器我想知道你是否可以帮助我解决问题。我有一个个人系统,在我的控制器中,create post 方法具有以下代码:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create (TicketViewModel model)
{
ICollection <Piece> pieces;
try
{
if (ModelState.IsValid)
{
if (_ticketRepository.GetById (model.Id)! = null)
{
Console.WriteLine ("Ticket already exists!");
}
var _model = _mapper.Map <Ticket> (model);
var count = _ticketRepository.FindAllByPiece (_model);
if (count> 0)
{
ModelState.AddModelError ("", "This ticket already exists for this room. Check the piece, date and time.");
pieces = _pieceRepository.FindAll ();
model.Pieces = pieces;
return View (model);
}
_ticketRepository.Insert (_model);
model.Seats = RegistrationSeats (model.QuantityOfSeats);
return RedirectToAction ("Index"); …
Run Code Online (Sandbox Code Playgroud) c# ×3
wpf ×3
asp.net-core ×2
.net-4.0 ×1
.net-4.5 ×1
angular ×1
angular-cdk ×1
asp.net ×1
dbcontext ×1
icommand ×1
layer ×1
linq ×1
repository ×1
ui-testing ×1