0

私はwinformアプリケーションで3層アーキテクチャを使用しているため、機器の操作を処理する静的クラスがあります

 public static class Equipments 
{


    public static void AddEquipment(string name, decimal dimLength)
    {

            DBClassesDataContext db = new DBClassesDataContext();

            Equipment equipment = new Equipment();
            equipment.Name = name;
            equipment.DimLength = dimLength;

            db.Equipments.InsertOnSubmit(equipment);
            db.SubmitChanges();

    }



  public static void UpdateEquipment(int equipmentID, string name, decimal dimLength)
        {
                         DBClassesDataContext db = new DBClassesDataContext();

                Equipment oldEquipment;
                oldEquipment = db.Equipments.Where("EquipmentID = @0",equipmentID).SingleOrDefault();
                oldEquipment.Name = name;
                oldEquipment.DimLength = dimLength;

                db.SubmitChanges();}

私の質問は次のとおりです。

  1. 各メソッドで DBClassesDataContext のインスタンスを作成する必要がありますか?
    グローバルな静的 DBClassesDataContext を実行したときに、正しく機能しなかったためです。
  2. メソッド内で毎回作成する代わりに DBClassesDataContext を処理するより良い方法はありますか (このクラスからメソッドを実行するたびに新しい DBClassesDataContext を作成するなど)

ありがとう

4

2 に答える 2

4

各メソッドで DBClassesDataContext のインスタンスを作成する必要がありますか?

SqlConnection非LINQコードでデータベースにアクセスするたびに、通常は新しいを作成する必要があるのと同じように、絶対にそうする必要があります。一般に、グローバルな状態は避けてください。ほとんどの場合、それは悪い考えです。

メソッド内で毎回作成する代わりに、DBClassesDataContext を処理するより良い方法があります。

いいえ、それはまさに正しいアプローチです。毎回それを作成することを避けようとするのはなぜですか?

于 2012-07-05T06:33:55.153 に答える
1

Jon Skeet に同意しないことでおそらく石打ちの刑に処せられることになるでしょうが、とにかくこれを投稿します。

すべてのメソッドでインスタンスを作成する必要はありません。少なくとも、これは好きではありません。私が従うのが好きな DRY と呼ばれる原則があります。自分自身を繰り返さないでください。回避できる同じ行を何度も繰り返すことは、明らかにこの原則に違反しています。

ここには複数のオプションがあります。

1.) メソッドをインスタンスメソッドとして定義します。おそらく次のようになります。

internal class MyDbActions
{
    private MyDbContext _myDbContext;
    private MyDbContext Db
    {
        get
        {
            if (_myDbContext == null) _myDbContext = new MyDbContext();
            return _myDbContext;
        }
    }

    internal void Add(SomeClass c)
    {
        Db.Table.AddObject(c);
        Db.SubmitChanges();
        Db.Dispose();
    }
}

またはそのようなもの、あなたはアイデアを得る。これは、必要に応じて変更できます。

2.) use はメソッドに依存性注入を使用できるため、次のようなものを検討してください。

public static class Equipments 
{
    public static void AddEquipment(DBClassesDataContext db, string name, decimal dimLength)
    {
            Equipment equipment = new Equipment();
            equipment.Name = name;
            equipment.DimLength = dimLength;

            db.Equipments.InsertOnSubmit(equipment);
            db.SubmitChanges();

    }
}

このクラスの外でデータコンテキストを管理します。

3.) リポジトリ パターン、作業単位パターン、および IoC を利用できます。サンプル コードは非常に長いため、ここには掲載しませんが、アイデアを提供するための 1 つのリンクを次に示します。

IoC、依存性注入、作業単位を使用した Linq to SQL のリポジトリ パターン

于 2012-07-05T08:44:10.523 に答える