Tag: 设计模式

优化存储库的SubmitChanges方法

我有以下存储库。 我使用工厂在LINQ 2 SQL生成的类和域对象之间进行映射。 以下代码将起作用; 但我看到两个潜在的问题 1)它在更新语句之前使用SELECT查询。 2)它需要更新所有列(不仅是更改的列)。 这是因为我们不知道域对象中所有列的更改。 如何克服这些缺点? 注意:可能存在基于特定列更新执行的方案(如触发器)。 所以我不能不必要地更新列。 参考 : LINQ to SQL:“UpdateCheck = Never”时不刷新更新 http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=113917 码 namespace RepositoryLayer { public interface ILijosBankRepository { void SubmitChangesForEntity(); } public class LijosSimpleBankRepository : ILijosBankRepository { private IBankAccountFactory bankFactory = new MySimpleBankAccountFactory(); public System.Data.Linq.DataContext Context { get; set; } public virtual void SubmitChangesForEntity(DomainEntitiesForBank.IBankAccount iBankAcc) […]

多表单应用程序显示和隐藏表单的最佳实践?

StackOverflow上有很多问题,询问如何隐藏Form1并显示Form2。 并且,通常会出现一些不同的答案: 1) // Program.cs Application.Run(new Form1()); // Form1.cs Form2 form2 = new Form2(); form2.Show(); this.Hide(); 2) // Program.cs Form1 form1 = new Form1(); Form2 form2 = new Form2(); form1.Show(); form2.Show(); Application.Run(); …etc.. 我不是在寻找像#1这样简单的一次性解决方案。 我正在寻找最佳的表单管理实践。 一个5-8种forms的应用程序,经常打开和关闭 – 管理这些表单的最佳方法是什么? 我的想法是让每个表单成为一个(懒惰?)Singleton并将它们埋没在某种FormsManager类中(比如解决方案#2但是++)。 然后单个表单可能会调用类似FormsManager.GetForm() 。 但我想知道有更多经验的人使用过什么。 同样,这些解决方案不应该是快速破解。 它们应该是面向设计的 ,可能是架构的 ,也是长期的解决方案 。 编辑: 对于可能遇到同样问题的人来说,这是一个非常通用的问题(因此要求非常开放)。 具体到我的情况,我不需要在启动时显示多个表单。 另外,我没有MDI表格。 我可能有一些模态forms,但它们大多是非模态的。

固态原理示例在哪里?

即使我们没有意识到,我们都会用一些模式编写代码。 我试图真正理解一些SOLID原则以及如何在现实世界中应用这些原则。 我正在与“ D ”挣扎。 我有时会将依赖性反转与dependency injection混淆。 这是否意味着只要您依赖抽象(IE:接口)保持事物就完成了。 有没有人有一个小C#的例子来解释它? 谢谢。

在C#中搜索字节数组中的最长模式

我需要编写有效且快速的方法来搜索给定模式的字节数组。 我这样写,你怎么想,怎么改进? 它有一个bug,它不能返回长度为1的匹配。 public static bool SearchByteByByte(byte[] bytes, byte[] pattern) { bool found = false; int matchedBytes = 0; for (int i = 0; i = pattern.Length) { for (int j = 1; j < pattern.Length; j++) { if (bytes[i + j] == pattern[j]) { matchedBytes++; if (matchedBytes == pattern.Length – 1) { return true; […]

在C#中使用接口有什么好处?

几年前我被迫进入一个工作的软件项目,并被迫快速学习C#。 我的编程背景很弱(经典ASP)。 这些年来我学到了很多东西,但由于我学习C#的强制性,我还有很多基本概念。 具体来说,一个界面。 我理解基础知识,但在编写应用程序时,我很难找到实际使用的应用程序。 为什么要为他们的应用程序编写接口? 谢谢凯文

究竟什么是“基于接口的编程”?

我经常听到/阅读有关基于接口的编程,但我并不清楚这究竟意味着什么。 基于接口的编程是一个真正独立的主题,实际上有关于它的书籍吗? 如果是这样,任何人都可以推荐任何好的吗? 我遇到了基于接口的编程,因为我正在阅读有关如何设计好API并希望了解更多信息的方法。 现在我不清楚如何正确地设计围绕接口的API。 非常感谢任何信息。

业务逻辑层和数据访问层:循环依赖

我有一点建筑问题。 在我的项目中,我有一个业务逻辑层(BLL),其中包含我的所有业务规则,模型和接口的OO API。 每个对象都有像getById这样的静态方法,它们返回所述对象的实例。 每个对象也有像save和delete这样的方法。 这是非常简单的OO代码。 现在我有一个DataAccess层(DAL),包含在一个单独的命名空间中,对于每个BLL对象,我有一个DataClass或“Repository”,它执行getById和save命令。 所以在某种程度上,BLL save和getById方法是围绕DataClass方法的薄层。 public static NewsItem GetByID(int id) { return DataFactory.GetNewsItemRepository().GetNewsItemById(id); } 为了让DataClasses返回BLL对象,他们需要知道BLL。 所以现在我们有: GUI —> BLL DAL DataFactory只返回实现接口的对象,因此我可以隐藏“OracleNewsItemRepository”之类的实现细节。 但是现在,自从我开始面向对象编程以来一直困扰着我的事情。 在我目前的解决方案中,BLL和DAL都需要相互了解。 这是循环依赖关系,最佳做法是避免循环依赖关系。 另外我只想暴露接口(和我的DataFactory)而不是我的类。 这可以通过将DAL层放在单独的Assembly中来完成。 这是有道理的。 但是,Visual Studio不允许两个程序集相互引用。 另一个问题是: C#内部访问修饰符 不知怎的,我认为我的整个数据访问模式错了。 感觉就像我正在使用DataMappers等其他东西来卷积ActiveRecord模式。 我花了很多时间在Martin Fowler的网站上,但这些模式被描述得非常通用,并用非常抽象的UML图表来说明。 他们没有解决我的问题。 也许我有点肛门,而且没有“完美的数据访问模式”这样的东西。 而我现在所做的并不是非常错误。 但我现在怎么做,好像…… 有任何想法吗?

查看模型和dependency injection

在使用PRISM和Enterprise Library进行大量CRUD操作的LOB桌面应用程序时,我注意到一种反复出现的模式似乎很烦人。 对于每个域模型实体(例如,Contact),我发现我用视图模型(例如ContactVM)自我包装然后我引入一个新的ContactsVM (注意’s’),其中后一个类接受一个存储库接口,用于填充一个ObservableCollection ,对于我从存储库中读取的每个Contact实体,我将它包装在ContactVM ,我将实体传递给构造函数以及我的ViewModel所需的其他企业库服务。 问题是我的所有视图模型构造函数都开始采用这样的模式: ViewModel(EntityToWrap e, DependencyFromEntLib, OtherDependencies …) 现在这是一个问题,因为大多数工具和库需要默认的无参数构造函数(例如,某些商业数据网格需要提供过滤支持),而且您不能使用设计数据来实现实体可视化,因为它们也需要无参数构造函数。 最后一个问题:构建视图模型的正确方法是什么?应该通过构造函数还是通过ServiceLocator提供Entlib服务?

DDD访问外部信息的方法

我有一个现有的银行应用程序类,如下所示。 银行账户可以是SavingsBankAccount或FixedBankAccount。 有一个名为IssueLumpSumInterest的操作。 对于FixedBankAccount,仅当帐户所有者没有其他帐户时才需要更新余额。 这要求FixedBankAccount对象了解帐户所有者的其他帐户。 如何通过遵循SOLID / DDD / GRASP /信息专家模式来做到这一点? namespace ApplicationServiceForBank { public class BankAccountService { RepositoryLayer.IRepository accountRepository; ApplicationServiceForBank.IBankAccountFactory bankFactory; public BankAccountService(RepositoryLayer.IRepository repo, IBankAccountFactory bankFact) { accountRepository = repo; bankFactory = bankFact; } public void IssueLumpSumInterest(int acccountID) { RepositoryLayer.BankAccount oneOfRepositroyAccounts = accountRepository.FindByID(p => p.BankAccountID == acccountID); int ownerID = (int) oneOfRepositroyAccounts.AccountOwnerID; IEnumerable accountsForUser […]

使用LINQ将多个列表合并到一个列表中

有没有一种灵活的方法可以使用LINQ将多个列表合并到一个列表中以有效地复制它? public class RGB { public int Red { get; set; } public int Green { get; set; } public int Blue { get; set; } public RGB(int red, int green, int blue) { Red = red; Green = green; Blue = blue; } } public void myFunction() { List red = new List { […]