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

本文关键字:容器 DI Ninject 访问 VS 何避免 程序集 循环 引用 | 更新日期: 2023-09-27 18:34:57

想象一下,我有一个包含 2 个类库项目的解决方案:project1 公开了一些接口,project2 公开了一些接口,(!( 使用来自 project 1 的接口。我还有 project3,它使用所有必要的接口 bindigns 设置 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() { }
}

为了设置绑定,项目 3 需要引用项目 1 和项目 2。为了使用 DI 容器,project2 需要引用 project3 - 但我无法添加它,因为 VS 显示错误消息,即添加此引用会导致循环依赖。

如何处理这个问题?我应该在 XML 中配置依赖项吗?

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

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

kernel.Get<ISomeDependency>()

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

可以将接口移动到另一个程序集。

依赖反

转和依赖注入可以很好地结合在一起,但如果你不小心,可能会纠缠在一起。

只需要一些时间来习惯如何构建项目。

编辑

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