Tag: 架构

数据实体>域对象> ViewModels,每个都具有截然不同的数据结构

对于数据实体,域对象和ViewModel之间的映射,这是一个通用问题。 我可能不会问它,但希望我能理解它。 以下是一个简化的问题。 假设我有一个entity framework模型,它将1:1映射到我的数据库表,但我的域对象可能不相同,我的ViewModel再次完全不同。 作为一个伪示例: 数据库/ EF实体: MembershipAccount MembershipAccountExtraInfo 域: 帐户 轮廓 喜好 视图模型: UserProfileModel 假设我需要显示一个UserProfileModel,它具有:Username( 来自MembershipAccount ),SignupDate( 来自MembershipAccount ),FullName( 来自MembershipAccountExtraInfo )和TimeZone( 来自MembershipAccountExtraInfo ) 我可能需要什么样的关系,以及什么样的映射机制? 像AccountMapper这样的东西会同时接受MembershipAccount和MembershipAccountExtraInfo并返回一个帐户吗? 当需要几个对象来创建单个域实体时,我有点卡在映射上,反之亦然。 如果它有帮助:我正在设计一个用于管理用户帐户,用户配置文件,用户首选项等的API,但数据库表到处都是。 可能需要从跨越4-5个表和2个数据库的数据创建单个用户配置文件。 我的数据库表和任何(逻辑)域对象之间没有1:1映射。 谢谢!

数据库主键C#映射 – 字符串或int

在Northwind Starters Kit中,数据库中的主键映射到C#中的字符串。 这是好习惯吗? 如果是这样,为什么? thx,Lieven Cardoen ps:对不起可能是错误的问题…… 在Northwind Starters Kit中,某些表具有数据类型为int的自动增量主键,而其他表具有数据类型为nchar(5)的非自动增量主键。 为什么是这样? 好吧,显然一些主键只是代码(nchar(5)格式)。 很抱歉用了你的时间。 我认为数据类型int被映射到C#字符串,这对我来说似乎非常错误(但事实并非如此)。

在单个方法中针对XSDvalidationXML

我需要实现一个C#方法,该方法需要针对外部XSDvalidationXML并返回一个布尔结果,指示它是否格式正确。 public static bool IsValidXml(string xmlFilePath, string xsdFilePath); 我知道如何使用回调进行validation 。 我想知道它是否可以在一个方法中完成,而不使用回调。 我需要这个纯粹用于美容目的:我需要validation多达几十种类型的XML文档,所以我想做的就像下面这样简单。 if(!XmlManager.IsValidXml( @”ProjectTypes\ProjectType17.xml”, @”Schemas\Project.xsd”)) { throw new XmlFormatException( string.Format( “Xml ‘{0}’ is invalid.”, xmlFilePath)); }

在C#中表示游戏卡类的最佳方式

我使用类卡,其中包含2个枚举属性(套件 – 心形钻石黑桃和俱乐部)和卡值从2到A.并覆盖ToString()方法返回类似Ah Ad等等。一切正常但枚举值无法启动有了数字,因此枚举的卡片值看起来像x2,x3,x4 ……它不漂亮。 还需要简单的方法来解析单个字符串中的几张卡片。 谁知道设计这门课程的最佳方法?

WCF – 设计参数决策

我正在为FundManagement设计服务。 FundManagement Service有一个名为“UpdateFundApprovalDate(FundDTO fund)”的操作。 此操作将使用fundingID的批准日期更新资金表记录。 该服务将由“FundManagementUI”客户端使用。 如果合同续订正在进行,则有一项业务规则,即不应更新批准日期。 有一个单独的续订服务。 续订服务使用续订表中的数据(其中包含资金ID)。 更新表的结构是(RenewalID,FundingID,RenewalStartDate,Renewal CompletionDate,RenewalStatus)。 有一个名为“public List GetInProgressRenewal(FundDTO fund)”的服务操作。 一点很重要。 虽然两个服务都使用相同的数据库,但“续进”续订应由续订服务决定。 它可以基于续订记录的状态或完成日期。 续订服务决定“进行中”续订的业务逻辑。 FundManagement Service声称没有对该逻辑的所有权。 什么是解释上述行为的SOA原则/模式? (使用续订服务确定“进行中”续订,但续订服务可能会根据自身利益更改逻辑。)。 有关此类情景的指导原则是什么? 对于任何涉及此类设计决定的文章,您有什么建议吗? 在FundManagement Service内部,谁应该负责validation返回的续订列表是否为NULL? 这种validation应该在服务操作方法代码内部还是在FundBusinessLayer内部(服务人员调用)中进行? 注意:这里的SOA将使用WCF实现,业务classess将是使用C#开发的dll。 读: SOA / WCF剖析系统和服务边界

创建松散耦合/可扩展的软件架构

我已经研究了好几个星期了。 我目前正在使用n层(3层)方法和工厂设计方法设计松散耦合的架构设计。 我的目标是将每个客户端的业务逻辑(ClientA.DLL,ClientB.DLL)放在单独的命名空间中,以便项目扩展,这意味着我可以修改/删除/添加特定客户端的业务逻辑而不会影响其他客户端,因为它们是不依赖于彼此。 然后,我使用客户端的唯一标识符(在数据库中维护的字符串值)通过Factory命名空间调用客户端的名称空间/类。 Factory.DLL还隐藏了每个客户端的逻辑,而BusinessAbstract.DLL则用作每个客户端的类将使用的布局或模板。 这是项目解决方案: 这是实际的代码: BusinessAbstract.DLL namespace BusinessAbstract { // the entity / data transfer object public class MemberDTO { public string MemberID { get; set; } public string MemberName { get; set; } } // the interface public interface IMaintainable { void Add(); void Edit(); void Delete(); } // the base abstract […]

服务层(.NET应用程序)中的授权和用户信息

我目前正在使用.NET环境中的企业应用程序(n-layered),我想知道在BussinessLayer(BL)中管理身份validation/授权+数据过滤的最佳方法。 我们将使用来自多个接口(ASP.NET应用程序和Web服务)的BL,我认为我的ServiceLayer应该完成这项工作,但我找不到最好的方法。 我想它可能是这样的:(1)用户可能使用FormsAuthentication进行身份validation(ASP.NET Web客户端)。 (2)ASP .NET代码(Controller / CodeBehind)实例化服务以完成一些用户案例,以某种方式传递“用户”。 (3)服务方法检查“用户”是否存在(认证)和他的角色(授权)以validation他是否可以调用该方法。 如果未经过身份validation或授权,则会引发exception。 (4)服务使用存储库+其他服务+完成工作所需的任何服务。 如果需要某种细粒度过滤(例如,用户仅对某些项目具有权限),则服务会自动应用它。 我想要的是将ServiceLayer与’web stuff’隔离(不访问会话…),但是谁知道User调用其方法来正确操作。 此外,我不知道如何以良好的方式将该工作与ASP .NET身份validation相匹配……我正在考虑在服务ctor中总结“用户”,以便其方法具有所需的“上下文”,可以那工作?…我会很感激一些迹象或现有的代码片段。 谢谢您的帮助…

在存储库模式的抽象类上使用接口的优势?

可能重复: 接口与基类 通常可以看到使用Interfaces实现的存储库模式 public interface IFooRepository { Foo GetFoo(int ID); } public class SQLFooRepository : IFooRepository { // Call DB and get a foo public Foo GetFoo(int ID) {} } public class TestFooRepository : IFooRepository { // Get foo from in-memory store for testing public Foo GetFoo(int ID) {} } 但你可以使用抽象类同样做到这一点。 public abstract class FooRepositoryBase […]

WCF Duplex客户端的最佳实践

我不能否认双工异步调用的性能优势,但有些事情让我感到谨慎。 我担心的是,给定一个客户端对象实例化,WCF能否告诉哪个特定的客户端服务实例将收到回调参数? 谁能告诉我这是不是一个好主意? 如果不是为什么不呢? new DuplexChannelFactory( new ClientService(), new NetTcpBinding(), new EndpointAddress(“net.tcp://localhost:1234/”+Guid.NewGuid())) 如果保留上面的虚拟路径,则如何将其丢弃。 我希望客户端服务的生命周期相当短。 IE发出请求并收到响应,完成接收后,将其杀死。 将客户端服务生命周期缩短而不是将其整合并使其保持更长时间的性能损失有多糟糕。 这个想法是为了避免超时问题。 完成接收,发送,尽快处理。 按照惯例 – 无法传递客户服务。 如果您需要信息,请创建一个新的,简单的 – 就像EF / L2S等。 从WCF服务本身内部,如何终止与客户端的会话。 即。 我不希望客户端结束会话 – 我知道我可以相应地修饰我的操作,但我希望服务在满足某些条件时以编程方式终止自身。 我可以相应地粘贴端口并转发以解决任何防火墙问题,但我担心的是客户端是否坐在负载均衡器后面。 服务如何知道要调用哪个特定服务器?

延迟加载 – 最好的方法是什么?

我见过很多懒加载的例子 – 你有什么选择? 给定一个模型类,例如: public class Person { private IList _children; public IList Children { get { if (_children == null) LoadChildren(); return _children; } } } Person类不应该知道它是如何被装载的……或者它应该是什么? 当然它应该控制何时填充属性? 您是否有一个将Person与其子集合耦合在一起的存储库,或者您是否会使用不同的方法,例如使用lazyload类 – 即便如此,我也不希望在我的模型体系结构中使用lazyload类模糊。 如果首先请求一个Person然后它的子节点(即在这个例子中不是延迟加载)或者以某种方式延迟加载,你将如何处理性能。 这一切都归结为个人选择吗?