3

長年のリスナー、初めての発信者。

私はおそらくこれに対して間違ったアプローチを取っているので、どんな助けも素晴らしいでしょう。

私は C#、MVC 4、Code First、Entity Framework 4.3、および Razor を使用しています。

EFデータクラスといくつかのメソッドを別のクラスプロジェクトに分割して、他の複数のプロジェクトから一般的に参照できるようにしようとしています。この問題をできるだけ強調するために、この単純化された例を作成しました。

だから私が持っているクラスプロジェクトでは:

public MyGeneric(string name)
{
    ID = Guid.NewGuid();
    Name = name;
}

public Guid ID { get; set; }
public string Name { get; set; }


public void AddThis(MyGeneric obj)
{
    using (var db = Activator.CreateInstance<myDbContext>())
    {
        var myOthers = from mo in db.MyOther
                       where mo.OtherID == obj.ID
                       select mo;

        myOthers.ForEach(mo => db.MyOther.Add(mo));
        db.SaveChanges();
    }
}

そして、次のようなメイン プロジェクトでこれを参照できます。

public class SampleInherit : MyGeneric
{
    public SampleInherit(string newName, string secName)
        : base(newName)
    {
        SecName = secName;
    }

    public string SecName { get; set; }


    public void DoSomething(SampleInherit obj)
    {
        base.AddThis(obj);
        // do other stuff
    }
}

私がやろうとしているのは、いくつかのクラスとそのメソッドを別のサイド プロジェクトにジェネリック化することです (それは単語ですか?)。このサイド プロジェクトは、(必要な順序で) 次の基本クラスを提供します。

  • EF DbContext を使用してデータベースを作成/アクセスし、
  • より多くのプロパティを追加できるようにする
  • 基礎となるデータに影響を与える方法/手順を提供し、
  • メインプロジェクトに合わせてより適切に名前を変更してください。

基本クラスをメイン プロジェクトのクラスに継承するだけで、基本クラス参照 myDbContext と LINQ ステートメント内のエンティティ オブジェクト参照を除いてすべて機能します。

DataContext を遅延バインドできますか、それともここで自分自身を隅に描きましたか?

あなたが与えることができるすべての助けに乾杯.

4

1 に答える 1

0

あなたがやろうとしているのは、IRepository パターンを実装することだと思います。基本的に、エンティティと IRepository を含むクラス プロジェクトを作成します。そこから、Repository クラスを作成して、IRepository の具体的な実装を作成します。ビジネス ロジック層を使用して、IRepository を介してリポジトリにアクセスします。そして、そこにデータアクセスを行います。

public interface IRepository<T>
{
    IQueryable<T> Fetch();

    bool Insert(T entity);

    bool Update(T entity);
}

次に、リポジトリを作成します

public class MyRepository<TContext> : IRepository<EntityType> where TContext: DbContext, new()
{
    private TContext context;

    public MyRepository(TContext context)
    {
        this.context = context;
    }

    public IQueryable<T> Fetch()
    {
       return context.EntityTypes;
    }

    // Insert and update logic
}

最後にビジネス ロジックを作成します。

public class BusinessLogic
{
    private IRepository<EntityType> repository;

    public BusinessLogic(IRepository<EntityType> repository)
    {
        this.repository = repository;
    }

    public void Add(EntityType obj)
    {
      bool isNew = // check if new
      if(isNew)
      {
        this.repository.Insert (obj)    
      }
      else
      {
        this.repository.Update(obj);
      }
    }
}

次に、ビジネスロジックを呼び出します

IRepository<EntityType> repository = new MyRepository<MyDbContext>(new MyDbContext());
BusinessLogic service = new BusinessLogic(repository);

service.Add(new EntityType());

データ コンテキストの遅延バインディングは必要ないと思います。パフォーマンスを考慮してジェネリックを使用することをお勧めします (上記の例のように)。また、このメソッドを使用すると、データ コンテキストをインスタンス化してビジネス サービスに渡すことができるため、エンティティ フレームワークは、AddThis の呼び出しごとに新しいデータ コンテキストをインスタンス化するのではなく、エンティティを追跡できます。さらに、このパターンを使用すると、ninject のような IOC コンテナーを使用してこれらのビジネス サービスを作成したり、モックを使用してデータベースにアクセスすることなくコードの単体テストを作成したり (リポジトリをモックすることにより) など、あらゆる種類のクールなことを実行できます。 )。

于 2012-10-08T17:39:05.613 に答える