C#的命名空间范围问题

时间:2012-08-14 16:25:19

标签: c# namespaces

所以我有一个程序是3层程序,UI,BLL(业务逻辑层),当然还有DAL(数据访问层)。 UI始终与BLL对话,BLL使用DAL检索数据单元,以格式组装它们并将它们返回到UI。

因为这是为了我的工作,我想确保总是使用约定(并不是每个人都喜欢在自己想要的地方编程自己的风格!)。所以我觉得这样的事情会很好。

using (Bll.MyService service = new Bll.MyService()) {
    //My Sweet Code
} 

BUT !!!如果Bll位于我的UI不是的命名空间中,则这不是一个选项。这是我的意思的一个更长的例子。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MyApp;

//Entry point
namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            //I want to be able to do a using MyApp and access the Bll objects!
            Bll.ApiService service = new Bll.ApiService(); //ERROR LINE
        }
    }
}

//Data access layer
namespace MyApp.DAL
{
    class ApiDataAccessor
    {
        public int MyVar = 1;
    }
}

//The bacon letuce layer of course
namespace MyApp.Bll
{
    class ApiService
    {
        public void MyFunction()
        {
            //todo: make more awesome
        }
    }
}

如果有人有任何建议会很棒!谢谢!

编辑:

在代码中的注释中添加了//ERROR LINE,以便使错误显而易见。我也找到了一个黑客。 using Bll = MyApp.Bll将强制使用Bll.ApiService。我不知道我是否喜欢这个解决方案(因为它很容易搞砸并且生气直到我意识到我没有为名称空间添加别名)。

编辑(再次):

有一些解决方案。

  1. using Bll = MyApp.Bll位于顶部,然后该名称空间中的所有对象都必须使用Bll.MyObject引用,这是我们想要的!

  2. 需要完全限定名称。 MyApp.Bll.MyObject。这是我们不想要的(因为它可以通过大型命名空间得到详细信息)

  3. 只需在顶部包含命名空间即可。 using MyApp.Bll

  4. 总之,我们希望以某种方式获取using MyApp以允许我们引用所有这些名称空间及其对象,例如Bll.ThisObjectDal.ThatObject,相反,如果这是一个解决方案希望,实现这一目标的唯一方法是包含2个使用语句,这些语句是别名。 using Dal = MyApp.Dalusing Bll = MyApp.Bll

    感谢大家的帮助。

    这是解决方案

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using MyApp;
    using Bll = MyApp.Bll;
    
    //Entry point
    namespace ConsoleApplication2
    {
        class Program
        {
            static void Main(string[] args)
            {
                //I want to be able to do a using MyApp and access the Bll objects!
                Bll.ApiService service = new Bll.ApiService(); // <-- it works.
            }
        }
    }
    
    //Data access layer
    namespace MyApp.DAL
    {
        class ApiDataAccessor
        {
            public int MyVar = 1;
        }
    }
    
    //The bacon letuce layer of course
    namespace MyApp.Bll
    {
        class ApiService
        {
            public void MyFunction()
            {
                //todo: make more awesome
            }
        }
    }
    

4 个答案:

答案 0 :(得分:2)

好的,让我们看看:

  1. 如果这些图层是在不同的程序集(Class Library项目)上实现的,那么您必须确保引用它们(右键单击项目&gt;添加参考&gt;项目)。 UI应该引用BLL,它应该引用DAL
  2. 如果它们具有不同的命名空间,则必须声明using Namespace;语句或使用完全限定的名称,例如Namespace.Class
  3. 要在using(obj){...}块中使用,obj必须实现IDisposable接口。这是语言的按设计要求
  4. 请注意,我注意到这是最好的方法,您也不应该在项目中更改任何内容。如果您有更广泛的问题,例如“这是最佳解决方案”,那么我们可以讨论它。

答案 1 :(得分:2)

我认为这里存在混淆:你没有拥有名为Bll的名称空间。您有一个名为MyApp.Bll的命名空间。

无论是否有using MyApp指令,您都需要添加using MyApp.Bll指令,然后直接在代码中引用ApiService,或者将类完全限定为{{1} }}

如果您只是能够使用符号MyApp.Bll.ApiService引用MyApp.Bll命名空间,则可以为命名空间添加别名:

Bll

此外,基于对问题和各种答案的评论,值得指出的是using statement,它提供了一种方便的方式来声明和清理非托管资源,并且在代码中显示为块不是与导入名称空间的using directive相同。

答案 2 :(得分:1)

您可以使用其命名空间完全限定您的类型名称:

MyApp.Bll.ApiService service = new MyApp.Bll.ApiService();

答案 3 :(得分:0)

就个人而言,我更喜欢使用更具体的陈述。正如安德烈所提到的那样,您可能会在单独的类库中找到它们,然后根据需要将它们包含在您的项目中,但无论如何我通常使用如下语句:

using MyApp.Bll;
using MyApp.DAL;

如果包含多个名称空间,其中类引用不明确(即ApiService在您正在使用的多个名称空间中定义),那么您将明确标识该类。

MyApp.Bll.ApiService service = new MyApp.Bll.ApiService();