我正在开发一个遵循3层架构的项目,其数据访问层(DAL)由其他人编写。我检查了代码,发现他在数据访问层(DAL)中使用了两个类库和一个接口来连接数据库。界面为 IDBManager ,类库为 DBManagerFactory 和 DBManager 。
在类 DBManagerFactory 中,他声明了一个枚举DataProvider,如下所示:
using System;
using System.Data;
using System.Data.Odbc;
using System.Data.SqlClient;
using System.Data.OleDb;
public enum DataProvider
{
Oracle, SqlServer, OleDb, Odbc
}
namespace DataAccessLayer
{
public sealed class DBManagerFactory
{
private DBManagerFactory() { }
在界面 IDBManager 中,他使用这样的枚举:
using System;
using System.Data;
using System.Data.Odbc;
using System.Data.SqlClient;
using System.Data.OleDb;
namespace DataAccessLayer
{
public interface IDBManager
{
DataProvider ProviderType
{
get;
set;
}
string ConnectionString
{
get;
set;
}
所以,我的问题是在命名空间之外声明枚举是一种好方法还是坏方法?我认为枚举应该在命名空间内声明,并通过命名空间在另一个类或其他项目中使用。请告知标准方法。
答案 0 :(得分:0)
对于编译器而言,只要没有名称冲突就没那么重要。
如果在单独的命名空间中定义,则两种类型可以具有相同的名称。 “空”命名空间也可以被视为命名空间。
假设您有两种类型,My.Namespace.DataProvider
和Your.Namespace.DataProvider
。如果你同时使用两者,你必须区分彼此:
private My.Namepspace.DataProvider myDataProvider;
private Your.Namepspace.DataProvider yourDataProvider;
但是,如果您只需要一个,则可以使用using
:
using My.Namespace;
private DataProvider dataProvider;
这使代码更具可读性。无名称空间类型的问题是“空”命名空间总是“包含”。因此,请考虑使用My.Namespace.DataProvider
和无名称空间DataProvider
:
using My.Namespace;
private DataProvider dataProvider; // <-- unclear which one is used
在上面的示例中,编译器将使用My.Namespace.DataProvider
,一旦删除using
,它将立即切换到无名称空间类型。
这是违反直觉的,您通常希望将一组类型放在命名空间中以“捆绑”它们。
答案 1 :(得分:0)
是
定义接口是为了从具体实现中抽象出来(这样你可以让其他代码模块仅依赖于那个抽象,而不是特定的实现)。
enum
可以被视为特定实现(它具有特定值),因此接口立即依赖于此具体实现。因此,我个人更喜欢在与接口相同的命名空间中定义enum
,以限制对代码的未来维护引入更多依赖关系的可能性(如果enum
被移动到另一个项目,那么如果该项目具有依赖关系,它们成为接口的依赖关系)。
将它放在同一名称空间中可以帮助其他开发人员将其视为接口的紧密耦合依赖。