0

だから私は3層プログラム、UI、BLL(ビジネスロジックレイヤー)、そしてもちろんDAL(データアクセスレイヤー)であるプログラムを持っています。UI は常に、DAL を使用してデータ ユニットを取得する BLL と通信し、データ ユニットを形式にまとめて 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と、これらすべての名前空間とそのオブジェクトを and のように参照できるようにしBll.ThisObjectたいDal.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 を参照する必要があり、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

個人的には、より具体的なステートメントを使用することを好みます。アンドレが述べたように、これらを別々のクラスライブラリにまとめて、必要に応じてプロジェクトに含めることになる可能性がありますが、いずれにせよ、通常は次のようなステートメントを使用します。

using MyApp.Bll;
using MyApp.DAL;

クラス参照があいまいな (つまり、使用している複数の名前空間で ApiService が定義されている) 複数の名前空間を含める場合は、クラスを明示的に識別します。

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