2012-02-27 24 views
2

多くのプロジェクトでは、ユーザーを含むテーブルを作成し、認証、保存などの標準ユーザーベースの機能を実装する必要があります。したがって、これらの機能を含むクラスライブラリを作成することにしました。たとえば、Entity Framework拡張可能なフレームワーク

public class User 
{ 
    public int? Id {get;set;} 
    public string UserName {get;set;} 
    public string Password {get;set;} 
} 

public class MyDbContext : DbContext 
{ 
    public DbSet<User> {get;set;} 
} 

public class UserService 
{ 
    public MyDbContext Context {get;set;} // will be initialized in constructor 

    public User GetByUserName(string username) 
    { 
    return (from s in Context.Users where s.UserName.Equals(username) select s).SingleOrDefault(); 
    } 

    // etc... 
} 

新しいMvcプロジェクトを開始するときに、このライブラリを追加してカスタムモデルでDbContextを拡張します。問題は、私は、たとえば、いくつかの追加のフィールドを持つUserテーブルを拡張する方法がわからないです。この場合は

public class MyUser : User 
{ 
    public bool IsApproved {get;set;} 
} 

public class CustomDbContext : MyDbContext 
{ 
    public DbSet<SomeOtherModel> {get;set;} 

    // problem: override DbSet in MyDbContext with class MyUser? 
    //public DbSet<MyUser> {get;set;} 
} 

私もMyDbContextDbSet<User>をオーバーライドする必要があります。ライブラリ内のDbSet<User>を削除すると、私のUserServiceクラスはもう使えなくなります。どのように拡張可能なフレームワークを作るためのアイデア?

答えて

2

あなたはジェネリック(私は、ちょうど考えを、これをテストしていません)を使用できます。その後、

public abstract class UserDbContext<TUser> : DbContext where TUser : User 
{ 
    public DbSet<TUser> Users {get;set;} 
} 

そして継承:

public class CustomDbContext : MyDbContext<MyUser> 

そしてUserServiceで同じジェネリック:

public abstract class UserService<TUser> where TUser : User 
{ 
    public UserDbContext<TUser> Context {get;set;} // will be initialized in constructor 

    public TUser GetByUserName(string username) 
    { 
    return (from s in Context.Users where s.UserName.Equals(username) select s).SingleOrDefault(); 
    } 

    // etc... 
} 
+0

ありがとうございます、これはうまく動作します! – Marthijn

2

Userから継承しないで、代わりにUserを部分クラスにして、Userのように拡張します。これは、ライブラリが単なるソースファイルの集合であり、アセンブリにコンパイルされていない場合にのみ機能します。

EDIT:

別のオプションは、単にあなたの枠組みの中でdbcontextを定義し、アプリケーションプロジェクトで、あなたのライブラリクラスを使用してそれを定義しないことです。フレームワーク内の初期化関数を呼び出して、必要なマッピングを行い、OnModelCreatingから呼び出すことができます。

+1

クラスが別のアセンブリにある場合(再利用可能なライブラリの場合) –

+0

@PaulTyng - それは当てはまります。 –

+0

あなたの答えをありがとうが、(残念ながら)Paul Tyngは正しいです。 – Marthijn

0

いつもコンポジションを使用し、MyUserにUserプロパティを含めることができます。次に、DbSetを持つまったく新しいDbContextを作成します。

これは、データベースに2つのテーブルを作成しますが、おそらく最も簡単です。

関連する問題