0

コンストラクターに渡すパラメーターを使用していくつかの質問を見つけましたが、それを特定の問題に変換することはできません。

MVCと組み合わせてEFコードファーストを勉強しています。

抽象クラスとインターフェースをベースとして作成しました。

public abstract class RepositoryBase<C, T> : IRepositoryBase<T> 
    where T: class where C : DbContext,  new()

public interface IRepositoryBase<T> where T : class

インターフェイスを持つ具象クラスで作成された私のモデルリポジトリのiv'e

public interface ICustomerRepository : IRepositoryBase<Customer>

public class CustomerRepository: RepositoryBase<PNMP, Customer>,
    ICustomerRepository

PNMP (私のコードの最初のコンテキスト) には、内部パラメーター _username を設定する変更を追跡するためのユーザー ID を受け入れるコンストラクターのみがあります。

public override int SaveChanges()
{
    var changeSet = ChangeTracker.Entries<IDatabaseBaseType>();

    if (changeSet != null)
    {
        var modifiedEntries =
            changeSet.Where(c => c.State== EntityState.Modified);

        foreach (var entry in modifiedEntries)
        {
            entry.Entity.ModifiedDate = DateTime.Now;
            entry.Entity.ModifiedBy = _username;
        }

        var addedEntries =
            changeSet.Where(c => c.State == EntityState.Added);

        foreach (var entry in addedEntries)
        {
            entry.Entity.CreatedDate = DateTime.Now;
            entry.Entity.CreatedBy = _username;
        }
    }
    return base.SaveChanges();
}

ID 変数を PNMP (コンテキスト) のコンストラクターに渡すにはどうすればよいですか

次を使用して、具体的なクラスをインターフェイスにバインドするためにNinject.MVC3を使用しています。

kernel.Bind<ICustomerRepository>().To<CustomerRepository>();
4

2 に答える 2

2

文字列プリミティブを注入する代わりに、抽象化に依存usernameさせてください。これにより、コンストラクターの引数をオーバーライドする必要がなく、サービスを簡単に登録できます。DbContextIUserContext

アップデート

IUserContext次のように、MVC 固有の実装を定義できます。

public class MvcUserContxt : IUserContext
{
    public string UserName
    {
        get { return HttpContext.Current.User.Identity.Name; }
    }
}

そして、次のように登録できます。

Bind<IUserContext>().To<MvcUserContext>();
于 2012-10-24T09:37:06.093 に答える
1

あなたが使用することができますWithConstructorParameter

kernel.Bind<IInterface>()
    .To<ConcreteClass>()
     .WithConstructorParameter("name", value);

ただし、DbContextを抽象化するためにリポジトリを使用しないことをお勧めします。それは本当の目的を果たしません。クラスの単体テストが必要で、データベースが簡単ではない場合は、モックリポジトリの作成に多くの時間を費やすことになります。理由はなく、データベースのスナップショットを使用して単体テストを行うだけです。

Microsoftは、DbContextを使用してデータベースを抽象化する非常に優れた作業を行いました。抽象化を抽象化する必要はありません。

于 2012-10-24T09:40:18.063 に答える