我应该在我的Singleton集合中使用接口以及如何,在哪里? C#

时间:2011-11-22 15:56:26

标签: c# interface singleton

我相信我不明白界面的全部目的。因此,我在这个问题上提出建议。

我的数据库上有几个表。很少有:Languages, FrontEndMenus, BackEndMenus ...... 这些表有不同的列,因此C#对象也有不同的属性(即使FrontEnd和BackEnd菜单对象有几个不同的字段)

出于性能目的,它们保存在名为(LanguageCollection, FrontEndMenuCollection, BackEndMenuCollection)的SINGLETON类中的RAM上

首先,所有这些对象肯定有3种方法,分别是“IsValid”,“Save”和“Remove”。 通常它们的使用方式如下:

LanguageItem item1 = new LanguageItem();
item1.IsValid();
item1.Save();
item1.Remove();

FrontEndMenuItem item2 = new FrontEndMenuItem();
item2.IsValid();
item2.Save();
item2.Remove();

//And Same as BackEndMenus class too.. 

当我想获得单件集合中的一个对象时,我称之为:

FrontEndMenuItem item = GetInstance.FilterSingleOrDefault(new FrontEndMenuItemArgs{ Id = 14 });

这是我的问题:

根据我的理解,为了制作灵活的结构,我应该对这些对象类使用接口实现(FrontEndMenuItem, LanguageItem, BackEndMenuItem

我做了类似的事情:

    public interface IBusinessItem
    {
        bool IsValid();
        OperationResult Remove();
        OperationResult Remove(bool isCommitOnDatabase);
        OperationResult Save();
        OperationResult Save(bool isCommitOnDatabase);
    }

但我不确定如何使用它......

你能否就这种方法给我一点指示?如果你能用非常简单的代码来帮助我,我会非常高兴。


我添加了评论,但由于它非常重要,我想将此部分添加到我现有的问题中:

当需要更新或插入时,对象本身会根据其字段进行更新,然后保存。它是这样的:

FrontEndMenuItem item2 = new FrontEndMenuItem();
item2.Title = "Some title";
item2.ModuleId = 5;
item2.LinkTypeId = 2;
item2.Save(); //Since its a new item its gonna be saved as new that means INSERT.

保存方法一旦从对象本身调用它就可以了解它是否为新item2.Save(),因此当IBusinessItem接口调用它时,此方法也可以正常工作。

但是,这些领域呢?在BackEndMenuItem中,没有ModuleId字段或LinkTypeId

可能有IBusinessItem.ModuleId = 5吗?如果是这种情况,我应该使用接口,如果没有,在什么情况下我可以在这个问题上使用接口?

非常感谢,

4 个答案:

答案 0 :(得分:2)

基本上,接口的使用是为了防止消费代码必须知道它正在处理的这两个特定实现(LanguageItem和FrontEndMenuItem)中的哪一个(如果它不必要)。所有必须知道的是,IBusinessItem的任何实现都有您定义的方法列表。

接口因此提供“松散耦合”;你不必知道对象是什么,你只需要知道它做了什么,或者更确切地说,你可以用它来做什么。

现在,如果您必须知道FrontEndMenuItem是您的使用中的FrontEndMenuItem,那么能够将其视为IBusinessItem并不会让您获益匪浅。但是,我会质疑你的用法;看起来两个实现的工作方式完全相同,那么为什么不能使用LanguageItem代替FrontEndMenuItem?有一些很好的理由,但也有一些非常糟糕的理由以这种方式进行设置。

答案 1 :(得分:1)

使用接口的一个主要好处是可以减少代码中的耦合。一方面,这样做会使您的代码更容易测试。

不确定你是如何使用静态类的,但是假设你在另一个使用它们的类中有一个方法。如果你紧密耦合(不使用接口),那么该方法将很难编写单元测试,因为你的方法现在紧密耦合到提供某种功能的静态类。

相反,如果您在方法中传递对实例的引用(或声明接口的类级实例,然后在构造函数中获取它的具体实例),那么您将能够模拟静态class(使用类似moq或RhinoMock的东西)并测试该方法的功能,而无需连接到具体的静态类。

通常,您希望尽可能减少代码中的依赖关系。

希望这有点帮助...

答案 2 :(得分:0)

您将项目类定义为实现IBusinessItem接口:

public class FrontEndMenuItem : IBusinessItem { //... }

然后您不必担心您正在使用的收集项目:

IBusinessItem item1 = new LanguageItem();  
item1.IsValid();  
item1.Save();  
item1.Remove();  

IBusinessItem item2 = new FrontEndMenuItem();  
item2.IsValid();  
item2.Save();  
item2.Remove();  

答案 3 :(得分:0)

您是否考虑过使用像温莎城堡这样的国际奥委会。这将提供完全解耦,默认的生活方式是Singleton,是的,使用Singleton和Interfaces是一个很棒的设计。