我最近开始阅读Evans的Domain-Driven设计书,并开始了一个小样本项目,以获得DDD的一些经验.同时我想了解更多关于MongoDB的知识,并开始用MongoDB和最新的官方C#驱动程序替换我的SQL EF4存储库.现在这个问题是关于MongoDB映射的.我看到用公共getter和setter映射简单对象非常容易 - 没有痛苦.但是我在没有公共设置者的情况下映射域实体有困难.据我所知,构建有效实体的唯一真正干净的方法是将所需的参数传递给构造函数.请考虑以下示例:
public class Transport : IEntity<Transport>
{
private readonly TransportID transportID;
private readonly PersonCapacity personCapacity;
public Transport(TransportID transportID,PersonCapacity personCapacity)
{
Validate.NotNull(personCapacity, "personCapacity is required");
Validate.NotNull(transportID, "transportID is required");
this.transportID = transportID;
this.personCapacity = personCapacity;
}
public virtual PersonCapacity PersonCapacity
{
get { return personCapacity; }
}
public virtual TransportID TransportID
{
get { return transportID; }
}
}
public class TransportID:IValueObject<TransportID>
{
private readonly string number;
#region Constr
public TransportID(string number)
{
Validate.NotNull(number);
this.number = number;
} …Run Code Online (Sandbox Code Playgroud) 我们使用C#开发了一个WPF应用程序,并使用RestSharp与一个简单的Web服务进行通信,如下所示:
Client = new RestClient(serviceUri.AbsoluteUri);
Client.Authenticator = new NtlmAuthenticator(SvcUserName, SvcPassword.GetString());
Run Code Online (Sandbox Code Playgroud)
这一切都很有效,直到我们收到一些电话(大多数工作)的应用程序无法连接到服务.用fiddler直接调用服务方法.然后我们提取了一个小的.net控制台应用程序并尝试使用RestSharp进行服务调用并直接使用HttpWebRequest,然后再次使用401失败.现在我们启用了System.Net跟踪并注意到了一些事情.在第一个401,这是正常的,故障机器产生这个日志:
System.Net信息:0:[4480]连接#3741682 - 收到的标题{连接:保持活动内容长度:1293内容类型:text/html日期:星期一,10八月2015 12:37:49 GMT服务器:Microsoft -IIS/8.0 WWW-Authenticate:Negotiate,NTLM X-Powered-By:ASP.NET}.System.Net信息:0:[4480] ConnectStream#39451090 :: ConnectStream(缓冲1293字节.)System.Net信息:0:[4480]将HttpWebRequest#2383799与ConnectStream相关联#39451090 System.Net信息:0:[4480]将HttpWebRequest#2383799与HttpWebResponse相关联#19515494 System.Net信息:0:[4480]枚举安全包:System.Net信息:0:[4480]协商System.Net信息:0:[4480] NegoExtender System.Net信息:0 :[4480] Kerberos System.Net信息:0:[4480] NTLM系统.
System.Net信息:0:[4480] AcquireCredentialsHandle(package = NTLM,intent = Outbound,authdata = (string.empty)\ corp\svc_account)
System.Net信息:0:[4480] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY,context =(null),targetName = HTTP/mysvc.mycorp.com,inFlags = Delegate,MutualAuth,Connection)System.Net Information:0 :[4480] InitializeSecurityContext(In-Buffers count = 1,Out-Buffer length = 40,返回代码= ContinueNeeded).
工作机器产生这样的输出:
System.Net信息:0:[3432]连接#57733168 - Empfangene Statusleiste:Version = 1.1,StatusCode = 401,StatusDescription = Unauthorized.System.Net信息:0:[3432]连接#57733168 - 标题{Content-Type:text/html服务器:Microsoft-IIS/8.0 WWW-Authenticate:Negotiate,NTLM X-Powered-By:ASP.NET Date:Mon, 2015年8月10日15:15:11 GMT内容长度:1293} wurden empfangen.System.Net信息:0:[3432] ConnectStream#35016340 :: …
我有一个"请求"实体与"RequestProperty"实体的关系为1 ..*.所以在"请求"中有一组RequestProperty对象.当我更新"请求"时,我想删除RequestProperty EntityCollection中的所有项目,并添加来自传入域对象的新项目.当我遍历Request.Properties集合并调用项目中的remove或a DeleteObject时,枚举失败,因为集合已被修改.
截至目前我正在这样做:
while (true)
{
if (newRequest.Properties.Count > 0)
context.RequestPropertySet.DeleteObject(newRequest.Properties.First());
else
break;
}
Run Code Online (Sandbox Code Playgroud)
由于这不是真的"酷",我认为必须有另一种方法来清空一个关系的集合.谢谢你的想法.
我目前正在尝试使用实体框架4.1的RC及其代码第一种方法为我的域对象实现存储库.现在我有一个域实体"Voyage",它有一个封装在"VoyageNumber"类型中的唯一标识符
public class VoyageNumber
{
private readonly string number;
public VoyageNumber(string number)
{
Validate.NotNull(number, "VoyageNumber is required");
this.number = number;
}
public string Id
{
get { return number; }
}
Run Code Online (Sandbox Code Playgroud)
现在,当我在配置DbContext时执行此操作时出现异常:
modelBuilder.Entity<Voyage>().HasKey<VoyageNumber>(k => k.VoyageNumber);
Run Code Online (Sandbox Code Playgroud)
属性'VoyageNumber'不能用作实体'Domain.Model.Voyages.Voyage'的关键属性,因为属性类型不是有效的键类型.只有标量类型,字符串和byte []是受支持的键类型.
当我尝试这个时:
modelBuilder.Entity<Voyage>().HasKey<string>(k => k.VoyageNumber.Id);
Run Code Online (Sandbox Code Playgroud)
属性表达式'k => k.VoyageNumber.Id'无效.表达式应该代表一个属性:C#:'t => t.MyProperty'
我是否真的要丢弃我的VoyageNumber并用原始类型替换它?
.net domain-driven-design entity-framework primary-key ef-code-first
我刚刚开始使用MongoDB(C#)并尝试从实体框架移植存储库.我正在使用官方的C#驱动程序1.0.现在我做了这样的事情:
internal class MongoContext
{
public MongoContext(string constring)
{
MongoServer server = MongoServer.Create(constring);
this.myDB = server.GetDatabase("MyDB");
BsonClassMap.RegisterClassMap<VoyageNumber>(cm =>
{ cm.MapField<string>(p => p.Id); });
BsonClassMap.RegisterClassMap<Schedule>(cm =>
{ cm.MapField<DateTime>(p => p.EndDate); cm.MapField<DateTime>(p => p.StartDate); });
BsonClassMap.RegisterClassMap<Voyage>(cm =>
{ cm.MapIdField<VoyageNumber>(p => p.VoyageNumber); cm.MapField<Schedule>(p => p.Schedule); });
}
private MongoDatabase myDB;
public MongoDatabase MyDB
{ get { return this.myDB; } }
}
Run Code Online (Sandbox Code Playgroud)
然后我继续这样实现Repository:
public class MongoVoyageRepository : IVoyageRepository
{
private readonly MongoContext context;
public MongoVoyageRepository(string constring)
{
this.context = new MongoContext(constring);
}
public void …Run Code Online (Sandbox Code Playgroud) 我目前正在从ADFS生成SAML令牌,如下所示:
WSTrustChannelFactory factory = null;
try
{
// use a UserName Trust Binding for username authentication
factory = new WSTrustChannelFactory(
new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential),
new EndpointAddress("https://adfs.company.com/adfs/services/trust/13/usernamemixed"));
factory.TrustVersion = TrustVersion.WSTrust13;
factory.Credentials.UserName.UserName = "user";
factory.Credentials.UserName.Password = "pw";
var rst = new RequestSecurityToken
{
RequestType = RequestTypes.Issue,
AppliesTo = new EndpointReference(relyingPartyId),
KeyType = KeyTypes.Bearer
};
IWSTrustChannelContract channel = factory.CreateChannel();
GenericXmlSecurityToken genericToken = channel.Issue(rst)
as GenericXmlSecurityToken;
}
finally
{
if (factory != null)
{
try
{
factory.Close();
}
catch (CommunicationObjectFaultedException)
{
factory.Abort();
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在假设我构建了一个使用这些令牌进行身份验证的Web应用程序.据我所知,工作流程应该是这样的: …
我们已经设置了一个WCF服务,该服务使用Unity容器来解析用于管理Exchange 2010 Powershell命令的实例.我们定义了一个IExchangePowershell接口,它有一个实现IDisposable的具体实现.一段时间后,我们遇到了无法执行powershell命令的问题,因为服务器说已经有太多的PowerShell会话打开了.似乎我们从未真正处理过我们的powershell实例.具体的Powershell的Dispose()方法将负责关闭运行空间和会话.一旦我在存储库方法中调用它,我们就不会再出现错误了.
((IDisposable)this.powershell).Dispose();
Run Code Online (Sandbox Code Playgroud)
现在我当然不希望在每个存储库方法中显式调用dispose.我认为团结可以解决这个问题.我们的WCF实例提供程序执行此操作:
public void ReleaseInstance(InstanceContext instanceContext, object instance)
{
container.Teardown(instance);
}
Run Code Online (Sandbox Code Playgroud)
但这并没有真正处理IExchangePowershell实例.你知道如何自动处理这些实例吗?
我目前正在使用xUnit,Moq和AutoFixture为我的Domain项目编写单元测试.我们来看看这个测试方法:
[Theory]
public void SameValueAs_OnOtherHasDifferentEmail_ReturnsFalse()
{
Fixture fix = new Fixture();
var sut = fix.CreateAnonymous<CoreAddress>();
var other = new CoreAddress(
sut.Firstname,
sut.Lastname,
sut.Company,
sut.Street,
sut.City,
sut.ZIP,
"other@email.com");
Assert.False(sut.SameValueAs(other));
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我正在测试类CoreAddress及其SameValueAs方法.为了测试每个可能的情况,我必须创建测试方法OnOtherHasDifferentFirstname,OnOtherHasDifferentLastname等.这个模式可以吗?关于AutoFixture的使用,我能以某种方式简化这个吗?
我现在开始开发一个新的WPF应用程序,我使用Unity作为DI容器.截至目前,我在App.xaml.cs中正在做这样的DI
protected override void OnStartup(StartupEventArgs e)
{
var container = new UnityContainer();
UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
container = (UnityContainer)section.Configure(container);
WPFUnityContainer.Instance = container;
var mainwindow = new MainWindow();
var mainmodel = container.Resolve<ViewModel.MainWindowViewModel>();
mainwindow.DataContext = mainmodel;
mainwindow.Show();
base.OnStartup(e);
}
Run Code Online (Sandbox Code Playgroud)
MainWindowViewModel的ctr如下所示:
public MainWindowViewModel(IUserRepository userRepository, IGroupRepository groupRepository)
{
this._ManagementWorkSpaces = new ObservableCollection<WorkspaceViewModel>();
this._ManagementWorkSpaces.Add(new ManageApplicationsViewModel());
this._ManagementWorkSpaces.Add(new ManageUserViewModel(userRepository, groupRepository));
}
Run Code Online (Sandbox Code Playgroud)
现在让我们看一下ManageUserViewModel:
public ManageUserViewModel(IUserRepository userRepository, IGroupRepository groupRepository)
{...
this._ManageGroupsCommand = new DelegateCommand(() =>
{
LookupGroupDialogViewModel vm=new LookupGroupDialogViewModel(groupRepository);
View.LookupGroupDialogWindow vw=new View.LookupGroupDialogWindow();
ModalDialogService.Service.ShowDialog(vw, vm, returnedVM =>
{
if (returnedVM.SelectedGroup!=null) …Run Code Online (Sandbox Code Playgroud) 我有一个PostgreSQL数据库表,具有以下简化结构:
基本上,该表包含许多用于设备的二维航路点数据.现在我想设计一个减少输出中坐标数量的查询.它应聚合附近的坐标(对于某个x,y阈值)一个例子:
第1行:DEVICE1; 603; 1205
第2行:DEVICE1; 604; 1204
如果阈值为5,那么这两行应该聚合,因为方差小于5.任何想法如何在PostgreSQL或SQL中一般这样做?
我有这样的durandal shell视图:
<div id="global">
<!-- ko compose: {view: 'nav'} -->
<!-- /ko-->
<div id="main" class="container">
<!--ko compose: {model: router.activeItem,
afterCompose: router.afterCompose,
transition: 'entrance'} -->
<!-- /ko-->
</div>
<div id="push"></div>
</div>
<!-- ko compose: {view: 'footer'} -->
<!-- /ko-->
Run Code Online (Sandbox Code Playgroud)
'nav'和'footer'是单独的html视图.当我运行网站时它工作正常,除了从未显示页脚html.但是,当我这样说时,页脚正在显示(虽然页面布局当然是错误的):
<div id="global">
<!-- ko compose: {view: 'nav'} -->
<!-- /ko-->
<!-- ko compose: {view: 'footer'} -->
<!-- /ko-->
<div id="main" class="container">
<!--ko compose: {model: router.activeItem,
afterCompose: router.afterCompose,
transition: 'entrance'} -->
<!-- /ko-->
</div>
<div id="push"></div>
</div>
Run Code Online (Sandbox Code Playgroud)
当我将页脚的html代码直接粘贴到shell中时,它当然也能正常工作.
我刚刚开始使用CTP4和Code-First.我有一个可能的约会网站的以下设置:
public class User
{
[Key]
public int Id { get; set; }
[Required]
public string LoginName { get; set; }
[Required]
public string Firstname { get; set; }
[Required]
public string Lastname { get; set; }
public string Street { get; set; }
[Required]
public string Zip { get; set; }
[Required]
public string City { get; set; }
[Required]
public bool Gender { get; set; }
[Required]
public int SoughtGender { get; set; }
[Required]
public string Password …Run Code Online (Sandbox Code Playgroud) c# ×7
mongodb ×2
.net ×1
adfs ×1
aggregate ×1
autofixture ×1
code-first ×1
dto ×1
durandal ×1
idisposable ×1
knockout.js ×1
ntlm ×1
postgresql ×1
primary-key ×1
restsharp ×1
saml ×1
sql ×1
unit-testing ×1
validation ×1
wcf ×1
wpf ×1