0

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

因为这是我的工作,所以我想确保始终使用约定(不是每个人都可以在任何地方编写自己的风格的忠实粉丝!)。所以我认为有这样的东西会很好。

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

但!!!如果 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.

总而言之,我们希望以using MyApp某种方式允许我们引用所有这些命名空间及其对象Bll.ThisObjectDal.ThatObject但是,如果这是所需的解决方案,那么实现这一目标的唯一方法是包含 2 个 using 语句,它们是别名。 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

4 回答 4

2

好吧,让我们来看看:

  1. 如果这些层是在不同的程序集(Class Library项目)上实现的,那么您必须确保引用它们(右键单击项目 > 添加引用 > 项目)。UI 应参考 BLL,即应参考 DAL
  2. 如果它们有不同的命名空间,您必须声明一个using Namespace;语句或使用完整的限定名,例如Namespace.Class
  3. 为了在using(obj){...}块中使用,obj必须实现IDisposable接口。这是语言的设计要求

请注意,我注意到这是最好的方法,您也不应该在项目中更改任何内容。如果您有更广泛的问题,例如“这是最好的解决方案”,那么我们也许可以讨论它。

于 2012-08-14T16:31:37.033 回答
2

我认为混乱就在这里:你没有一个名为Bll. 您有一个名为MyApp.Bll.

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

如果您所追求的只是能够MyApp.Bll使用符号引用命名空间Bll,则可以为命名空间设置别名:

using Bll = MyApp.Bll

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

于 2012-08-14T16:39:54.640 回答
1

你可以用它们的命名空间来完全限定你的类型名:

MyApp.Bll.ApiService service = new MyApp.Bll.ApiService();
于 2012-08-14T16:34:01.263 回答
0

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

using MyApp.Bll;
using MyApp.DAL;

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

MyApp.Bll.ApiService service = new MyApp.Bll.ApiService();
于 2012-08-14T16:37:36.510 回答