Tag: 设计模式

Activator.CreateInstance(string)和Activator.CreateInstance ()的区别

不,这不是关于generics的问题。 我有一个带有内部构造函数的几个类的工厂模式(如果没有通过工厂,我不希望它们被实例化)。 我的问题是CreateInstance失败了“没有为此对象定义的无参数构造函数”错误,除非我在非公共参数上传递“true”。 例 // Fails Activator.CreateInstance(type); // Works Activator.CreateInstance(type, true); 我想让工厂变得通用,使其更简单,如下所示: public class GenericFactory where T : MyAbstractType { public static T GetInstance() { return Activator.CreateInstance(); } } 但是,我无法找到如何传递“true”参数,以接受非公共构造函数(内部)。 我错过了什么或者不可能吗?

如何避免子类的工厂方法中的switch-case

假设我们有一系列类(卡片,为了它),我们需要根据一些标识符实例化它们。 工厂方法如下所示: public Card GetCard(int cardNumber) { switch(cardNumber) { case 13: return new King(); case 12: return new Queen(); case 11: return new Jack(); } //… } 我想要的是避免这种switch 。 为什么? 也许我想在function中重复使用这种比较。 我想出的是这样的: private Dictionary cardTypes = { {13, typeof(King)}, {12, typeof(Queen)}, {11, typeof(Jack)} }; public Card GetCard(int cardNumber) { var cardType = cardTypes[cardNumber]; var instance […]

数据访问层的设计模式

你可能觉得这是家庭作业,因为我很抱歉。 我搜索过但找不到合适的答案。 所以我的问题是: 我有几个类,每个类都有一个保存方法。 所以我为数据库处理创建了一个单独的类。 namespace HospitalMgt.Data { public static class DBConnection { public static string constr = “Data Source=ABD;Initial Catalog=HospitalMgt;User Id=sa;Password=123”; public static SqlConnection con; // public static SqlCommand com; public static SqlConnection OpenConnection() { con= new SqlConnection(constr); con.Open(); return con; } } } 但是,我不认为使用DBConnection类实现所有类是合适的。 我的问题 : 什么设计模式适合克服这个问题? 将DBConnection创建为类是一种好习惯吗? (或者它应该是一个接口) 我使用Factory方法找到了一些关于DA图层的文章,但据我所知,这种模式不适合我的情况。

C#/ C ++中的非虚拟接口设计模式

在设计界面时,有人建议使用非虚拟界面模式。 有人可以简要概述这种模式的好处吗?

在存储库模式中加载子记录

使用LINQ TO SQL作为基于存储库的解决方案的基础。 我的实现如下: IRepository FindAll FindByID Insert Update Delete 然后我有扩展方法,用于查询结果: WhereSomethingEqualsTrue() … 我的问题如下: 我的用户存储库有N个角色。 我是否创建了角色存储库来管理角色? 我担心如果我走这条路,我最终会创建几十个存储库(每个表1个,几乎除了连接表)。 每个表的存储库是否常见?

命令模式 – 目的?

阅读本文后: http : //sourcemaking.com/design_patterns/command 我仍然不太明白为什么我们需要这个。

将IoC容器引入旧版代码

我正在编写一个新的.NET库供我公司内部使用,它将通过dependency injection使用IoC。 当然,如果我们使用IoC容器来解析实例,这个库将更容易使用。 但是,将调用此库的代码当前不使用任何类型的dependency injection,并且重构遗留代码以使用DI超出了我的项目的范围。 那么,在这个遗留代码中开始使用Container从我的新库中获取实例的最佳方法是什么? 如果可能的话,我想避免乱丢遗留代码,硬编辑我选择的任何IoC容器。 由于我对DI相对较新,我们有可能会改变我们想要在某个时刻使用哪个Container的想法。 如果我将我的容器包装在CodePlex上的CommonServiceLocator库中,那么这是一种合理的方法吗? 其他人做了什么?

C#中基于任务的异步方法的超时模式

据我所知,有两种可能的模式来实现基于任务的异步方法的超时: 内置超时 public Task DoStuffAsync(TimeSpan timeout) 这种方法难以实现,因为实现整个调用堆栈的全局超时并不容易。 例如,Web API控制器接收HTTP请求并调用DoStuffAsync ,调用者希望全局超时为3秒。 也就是说,每个内部异步方法调用都需要接收已经使用过的时间的减法… 没有内置超时 public Task DoStuffAsync(CancellationToken cancellationToken) ………. CancellationTokenSource cancellationSource = new CancellationTokenSource(); Task timeoutTask = Task.Delay(3000); if(await Task.WhenAny(DoStuffAsync(cancellationTokenSource), timeoutTask) == timeoutTask) { cancellationSource.Cancel(); throw new TimeoutException(); } 这似乎是最可靠和易于实现的模式。 第一个调用者定义全局超时,如果超时 ,则将取消所有挂起的操作。 此外,它为直接调用者提供取消令牌,内部调用将共享相同的取消令牌引用。 因此,如果最高调用者超时,它将能够取消任何工作线程。 整个问题 有没有我缺少的模式,或者如果我使用no内置超时开发API,我是否正确?

重构代码以避免类型转换

我在.Net 4.0中有以下C#代码。 它需要对IRetailBusiness进行IBusiness的类型转换。 //Type checking if (bus is IRetailBusiness) { //Type casting investmentReturns.Add(new RetailInvestmentReturn((IRetailBusiness)bus)); } if (bus is IIntellectualRights) { investmentReturns.Add(new IntellectualRightsInvestmentReturn((IIntellectualRights)bus)); } 业务场景: 我正在为投资控股公司设计软件系统。 该公司拥有零售业务和IntellectualRights业务。 BookShop和AudioCDShop是零售业务的例子。 EngineDesignPatent和BenzolMedicinePatent是IntellectualRights业务的例子。 这两种业务类型完全不相关。 这家投资公司有一个名为InvestmentReturn的概念(但每个企业对这个概念都完全无知)。 InvestmentReturn是从每个业务获得的利润,并使用ProfitElement进行ProfitElement 。 对于每种“业务类型”(Retail,IntellectualRights),使用的ProfitElement是不同的。 题 如何重构此类设计以避免此type casting和type checking ? 摘要投资 public abstract class InvestmentReturn { public double ProfitElement { get; set; } public IBusiness Business{ get; […]

C#Metro(XAML):为任何(%)屏幕设计页面

我创建了一个媒体播放器,它在MainPage上有两个(主要)东西:页面左侧的ListView(用于播放列表)和覆盖页面右侧的MediaElement(用于音频和video)。 此外,页面的底部是空的,因为我正在使用AppBar,我有控件(播放,暂停,停止,音量,下一个,上一个,随机播放,重复,全屏等)。 在ListView上方,我有4个按钮,用于从ListView添加/删除文件。 问题是 : 当应用只在屏幕的一半时: ListView的宽度非常小,歌曲/video的标题是4-5行 MediaElement的宽度也非常小,它会丢失video的部分+它会破坏宽高比 当应用仅占屏幕的1/4(四分之一)时: ListView的宽度非常小,如果没有滚动,我看不到超过2-3首歌曲 我只看到在MediaElement上播放的video的一半 AppBar上的按钮发生碰撞 ListView顶部的按钮占据了屏幕的1/3(三分之一) 要解释一下我的页面设计 : 整个页面有一个Grid,有两行:在第一行,屏幕上的所有内容都有主网格,第二行只是AppBar的空间 我之前讨论过的主要网格是整个页面的两列: 在页面的第一列,我有MediaElement, Width=”800″ Height=”450″ 。 我知道使用像素设置宽度和高度不是一个好主意,但我不知道如何以另一种方式做到这一点 – 在第二列我有另外一个2行网格: 第一行包含一个VariableSizedWrapGrid,ListView顶部有4个按钮 第二行包含带有模板的ListView(Margin =“6,20”): 我还有包含2行网格的AppBar: 在第一行我有一个滑块: (滑块也讨厌宽度=“1000”属性,特别是当它在屏幕的1/4处时) 在第二行我有另一个Grid有两列,每列包含一个StackPanel按钮: 我跳得像: 在屏幕的1/2处:MediaElement位于页面顶部,ListView与页面底部的4个按钮 在1/4 pf的屏幕上:只有ListView和它上面的按钮可见(antListView中的文字会更小) 我已经看到Windowsapp store中的应用程序可以从全屏变为屏幕的1/2,所以它是可能的。 请帮助我这些人,我不是设计师,但我希望我的应用程序在页面的任何%上看起来都很好。