1

2つのクラスライブラリプロジェクトを含むソリューションがあると想像してください。project1はいくつかのインターフェイスを公開し、project2はいくつかのインターフェイスを公開し、(!)はproject1のインターフェイスを消費します。また、必要なすべてのインターフェイスバインドを使用してNinjectカーネルモジュールをセットアップするproject3もあります。これは次のようになります。

public class Dependencies : NinjectModule
{
    public override void Load()
    {
        Bind<IFileSystemWatcherFactory>().To<FileSystemWatcherFactory>();
        Bind<IFileSystemWatcher>().To<FileSystemWatcher>();
        Bind( typeof( IRepository<> ) ).To( typeof( NHibernateRepository<> ) );
        Bind<IFileSystemHelper>().To<FileSystemHelper>();
        Bind<IFileSystemInfoAdapter>().To<FileSystemInfoAdapter>();
        Bind<IFolderMonitor>().To<FolderMonitor>();
        Bind<IFolderMonitorBrowser>().To<FolderMonitor>();
        Bind<IFileManager>().To<FileManager>();
    }
}

public class DiContainer
{
    private static IKernel _container;
    public static IKernel Instance
    {
        get
        {
            if ( _container == null )
                _container = new StandardKernel( new Dependencies() );

            return _container;
        }
    }

    private DiContainer() { }

}

バインディングを設定するには、project3がproject1とproject2を参照する必要があります。DIコンテナを使用するには、project2にproject3への参照が必要ですが、VSにこの参照を追加すると循環依存が発生するというエラーメッセージが表示されるため、追加できません。

その問題にどう対処するか?XMLで依存関係を構成する必要がありますか?

4

2 に答える 2

2

project2 が project3 の複合ルートを参照する必要がある場合は、そこで何か間違ったことをしています。ほとんどの場合、あなたはやっています

kernel.Get<ISomeDependency>()

正しい方法は、ファクトリを使用することです。Factory エクステンションを見てください。

于 2012-05-23T10:21:24.947 に答える