Tag: 设计模式

这是什么样的模式(’提供者’)?

在工作中,我们使用的是一种我在GoF书中没有找到的“模式”(但这可能是由于在这个问题上缺乏能力,我只是略去了模式)而且我仍然怀疑。 比方说,如果我们有一个包含项目DataAccess的多项目解决方案,那么管理数据访问。 然后通常我看到它有这样的结构: Providers (Folder) – DataAccessProvider.cs Interfaces (Folder) – IFileLoader.cs Implementors (Folder) – FileLoader.cs 这里, FileLoader将是接口IFileLoader的internal实现,提供者看起来像这样: public static class DataAccessProvider { public static IFileLoader FileLoader { get { return new FileLoader(); } } } 这是什么样的设计模式(如果有的话),除了屏蔽IFileLoader接口的具体实现之外,它的真正用途是什么? 其次,这真的是“好风格”吗? 我想知道,例如,如果有很多电话会发生什么 string content = DataAccessProvider.FileLoader.LoadContentFromFile(“abc.txt”); 无论何时使用,都会调用new FileLoader() 。 是不是有更优雅的方式来做类似的方法?

共享连接字符串

我正在开发一个类库(C#),我将它用于我的不同项目(稍后)。 我的类库dll将使用项目的连接字符串/数据上下文,它将引用我的新dll。 我该怎么做? 假设我有一个名为“CLP”的类库项目和一个网站项目“WP”。 我可以添加对CLP.dll文件的引用,但我将如何将连接字符串/数据上下文对象传递给该DLL? 因为CLP.dll将根据“WP”的连接字符串访问db。 不确定我的问题是否清楚!

C#静态构造函数设计问题 – 需要指定参数

我有一个重新出现的设计问题,某些类需要一次性初始化,参数如外部资源的名称,如配置文件。 例如,我有一个corelib项目,它提供应用程序范围的日志记录,配置和一般帮助方法。 这个对象可以使用静态构造函数来初始化自己,但它需要访问一个它找不到的配置文件。 我可以看到几个解决方案,但这两个似乎都不对: 1)使用带参数的构造函数。 但是,每个需要corelibfunction的对象也应该知道配置文件的名称,因此必须在应用程序周围传递。 另外,如果我将corelib实现为单例,我还必须将配置文件作为参数传递给GetInstance方法,我认为这也是不对的。 2)创建静态属性或方法以传递配置文件或其他外部参数。 我有点使用后一种方法并创建了一个Load方法,它初始化一个内部类,它通过构造函数中的配置文件。 然后通过公共属性MyCoreLib公开这个内部类。 public static class CoreLib { private static MyCoreLib myCoreLib; public static void Load(string configFile) { myCoreLib = new MyCoreLib(configFile); } public static MyCoreLib MyCoreLib { get { return myCoreLib; } } public class MyCoreLib { private string configFile; public MyCoreLib(string configFile) { this.configFile = configFile; […]

这种模式叫什么? 软锁?

以下是我必须编写的一些代码,主要是与UI内容结合使用,并且总是会出现可能意外结束无限循环的事件。 public class MyClass { public event EventHandler MyEvent; private bool IsHandlingEvent = false; public MyClass() { MyEvent += new EventHandler(MyClass_MyEvent); } void MyClass_MyEvent(object sender, EventArgs e) { if (IsHandlingEvent) { return; } IsHandlingEvent = true; { // Code goes here that handles the event, possibly invoking ‘MyEvent’ again. // IsHandlingEvent flag is used to […]

我何时会在原生foreach循环中使用List .ForEach?

两种方法都有优势吗? 如果我需要遍历List项并对每个项执行操作,我应该使用传统的foreach循环机制还是继续使用List.ForEach? Matthew Podwysocki @ CodeBetter.com写了一篇关于反竞选活动的有趣文章。 这让我想到了循环试图解决的问题。 在本文中,Matthew认为显式循环结构会让你思考“如何”而不是“什么”。 使用一个优于另一个(如果有的话)有什么好的理由?

从DTO创建BO的模式/策略

我喜欢使用属性包对象(DTO)定义我的服务器接口的方法,但我不喜欢这样编写代码: void ModifyDataSomeWay(WibbleDTO wibbleDTO) { WibbleBOWithMethods wibbleBO = new WibbleBOWithMethods(); wibbleBO.Val1 = wibbleDTO.Val1; wibbleBO.Val2 = wibbleDTO.Val2; } 这种复制代码很难编写。 如果复制代码是不可避免的,那么你把它放在哪里? 在BO? 在工厂? 如果可以手动避免写锅炉板代码那么如何? 提前致谢。

尝试实现策略模式时的WrongClassException(区分自己的Id)

我正在尝试使用Fluent Nhibernate实现策略模式,受此博客文章的启发 public abstract class Strategy { protected Strategy() { } protected Strategy(Guid id) { this.Id = id; } public virtual Guid Id { get; set; } public abstract void SomeMethod(); } public class MyStrategy : Strategy { public MyStrategy() : base(new Guid(“F1CF041B …”)) { } public override void SomeMethod() { } } public class […]

抽象工厂模式和属性

我有点新设计模式,这是我在stackoverflow中的第一篇文章,所以希望这个问题有意义。 我已经创建了一个抽象工厂来处理为不同的图表供应商(dundas,flash等等)生成xml字符串。 下面是我工厂的代码大纲(如果它有帮助,我可以包含更多。)我希望我的客户能够设置所有类型的图表(标题,动画等)中常见的属性所以客户可以做这样的事情: GraphCreator fusion = new FusionGraphs(); //set the props for the graph fusion.Caption = “Fusion 2D Line Chart”; 做这个的最好方式是什么? 现在,我在抽象创建器中设置属性,以便客户端可以访问它们,但我还必须在我的工厂中复制这些属性,以便我可以在构建xml时访问它们。 //这是抽象工厂 public interface IXMLFactory { //add interface methods IRoot makeRoot(); IRootAttrib makeRootAttrib(); INodes makeNodes(); INodeAttrib makeNodeAttrib(); } //这是抽象的创作者 public abstract class GraphCreator { public virtual Graph getGraph(Graph.Types graphType) { //abstract product Graph graph; […]

如何在没有接口的情况下模拟多重inheritance?

如何在不使用接口的情况下模拟C#中的多重inheritance。 我相信,接口能力不适用于此任务。 我正在寻找更多’设计模式’导向的方式。

注入的依赖项是公共可访问还是私有?

是否应将依赖项存储到具有私有setter和public getter的私有字段或属性? 这适用于构造函数DI。 为了清楚起见,在属性示例中,我不希望将这些添加到附带的接口,除非它有意义 – 即它们只在实现类型中可见: interface IFoo { void DoSomething(); } class Foo : IFoo { private readonly IService dependency; public Foo(IService dependency) { this.dependency = dependency; } } class Bar : IFoo { public Foo(IService dependency) { this.Dependency = dependency; } public IService Dependency { get; private set; } }