如何避免VS程序集循环引用以访问DI容器(Ninject)?

时间:2012-05-23 08:13:37

标签: c# dependency-injection inversion-of-control ninject

想象一下,我有包含2个类库项目的解决方案:project1公开了一些接口,project2公开了一些接口,(!)使用了来自project1的接口。我还有project3,它使用所有必要的接口绑定设置Ninject内核模块。这看起来如下:

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中配置依赖项吗?

2 个答案:

答案 0 :(得分:2)

如果你的project2必须在project3中引用你的composit root,那么你在那里做错了。你很可能正在做

kernel.Get<ISomeDependency>()

正确的方法是使用工厂。看看Factory扩展。

答案 1 :(得分:1)

您可以将界面移动到另一个装配体。

依赖性倒置和依赖注入很好地结合在一起,但是如果你不小心的话,一个就会纠结。

只需要习惯一下如何构建项目。

修改

好的,可能不是那么简单:)但你应该拆分相关的位。将您的布​​线包含在作为解决方案一部分的某些基础架构项目中可能会更容易。它不一定是一个单独的项目,因为它与您的解决方案密切相关。