0

EntityFrameworkとNinjectv2.2を使用するMVC3プロジェクトがあり、リポジトリをラップするサービスレイヤーを使用して作業ユニットのパターンに従います。

以下のコードを見た後、うまくいけば、Ninjectがコンストラクターチェーンを使用して正しいクラスを注入していることが明らかになります。現在、私のアプリケーションでは完全に機能しますが、IDatabaseのインスタンスをInRequestScope()ではなくInSingletonScope()やInNamedScope()などの別のスコープでMyDatabaseにバインドする必要があります。[Named( "MyDatabaseScope")]属性を使用して、挿入するIDatabaseオブジェクトをカスタマイズできることはわかっていますが、コード構造では、SingletonScopedインスタンスを挿入する場合は、新しい抽象を再作成する必要があるようです。そして、私の作業単位、サービス、およびすべてのリポジトリの具体的な実装は、チェーンダウンします。

基本的に私のアプリケーションは現在行きます

コントローラ->作業単位->データベース、(リポジトリ->データベース)

データベースバインディングを変更する必要がある場合は、現在のチェーンに加えて別のチェーンを作成する必要があります。

コントローラ->新しい作業単位->SingletonDatabase、(新しいリポジトリ-> SingletonDatabase)

これは、DRYプリンシパルを完全に打ち負かすようです。コントローラーコンストラクターから、コンストラクターチェーンを実行するときに、Named属性または新しい属性を使用してすべてのクラスを再作成することなく、リクエストスコープバインディングではなくシングルトン(または名前付きバインディング)を使用する必要があることをNinjectに通知する方法はありますか?インターフェース?

長いテキストで申し訳ありませんが、コードスニペットとややとりとめのない説明なしで要点を理解できるかどうかはわかりませんでした。

モジュールロード機能の挿入:

..snip..
Bind<IUserServices>().To<UserServices>();
Bind<IBaseServices>().To<BaseServices>();
Bind<IUserRepository>().To<UserRepository>();
Bind(typeof (IRepository<>)).To(typeof (RepositoryBase<>));
Bind<IUnitOfWork>().To<UnitOfWork>();
Bind<IDatabase>().To<MyDatabase>().InRequestScope();

//This is my problem:
//Bind<IDatabase>().To<MySingletonDatabase>().InSingletonScope();

作業単位実装コンストラクター:

public class UnitOfWork : IUnitOfWork
{
    private IDatabase _database;

    public UnitOfWork(IDatabase database,
                      IUserRepository userRepository,
                      IPeopleRepository peopleRepository,
        )
    {
        this._database = database;
        this.UserRepository = userRepository;
        this.PeopleRepository = peopleRepository;
    }

    protected IDatabase Database
    {
        get { return _database; }
    }

    ...snip...
}

ユーザーサービスレイヤー実装コンストラクター:

public class UserServices : BaseServices, IUserServices
{
    private IUnitOfWork _uow;

    public UserServices(IUnitOfWork uow)
        : base(uow)
    {
        _uow = uow;
    }
    ...snip...
}

ユーザーリポジトリコンストラクター:

public class UserRepository : RepositoryBase<User>, IUserRepository
{
    public UserRepository(IDatabase database)
        : base(database)
    {
    }
    ...snip...
}

コントローラーコンストラクター:

public IUserServices _userServices { get; set; }

    public ActivityController(IUserServices userServices)
    {
        _userServices = userServices;
    }
}
4

1 に答える 1

0

Ninject 3.0.0を使用すると、次を使用できますWhenAnyAncestrorNamed("Some name")。ただし、非同期を実行する必要がある場合は、アプリケーションをWebフロントエンドとサーバーバックエンドに分割する必要があります。これにより、多くのことが簡単になります。

于 2012-05-23T15:18:02.887 に答える