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

C# 如何避免VS程序集循环引用以访问DI容器(Ninject)?,c#,dependency-injection,inversion-of-control,ninject,C#,Dependency Injection,Inversion Of Control,Ninject,假设我的解决方案包含两个类库项目:project1公开一些接口,project2公开一些接口,并且(!)使用project1中的接口。我还有project3,它使用所有必要的接口绑定设置了Ninject内核模块。如下所示: public class Dependencies : NinjectModule { public override void Load() { Bind<IFileSystemWatcherFactory>().To<Fi

假设我的解决方案包含两个类库项目: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() { }

}
公共类依赖项:NinjectModule
{
公共覆盖无效负载()
{
绑定()到();
绑定()到();
绑定(typeof(IRepository))到(typeof(NHibernateRepository));
绑定()到();
绑定()到();
绑定()到();
绑定()到();
绑定()到();
}
}
公共类双容器
{
专用静态IKernel_容器;
公共静态IKernel实例
{
得到
{
if(_container==null)
_容器=新的标准内核(新的依赖项());
返回容器;
}
}
私有双容器(){}
}
为了设置绑定,project3需要引用project1和project2。为了使用DI容器,project2需要引用project3,但我无法添加它,因为VS显示了一条错误消息,即添加此引用将导致循环依赖


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

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

依赖项反转和依赖项注入可以很好地结合在一起,但是如果你不小心的话,你可能会陷入困境

只是需要一些时间来习惯你如何组织你的项目

编辑


好的,可能没那么简单:)但是你应该把相关的部分分开。在作为解决方案一部分的基础设施项目中包含布线可能会更容易。它不需要是一个单独的项目,因为它与您的解决方案密切相关。

如果您的项目2必须在项目3中引用您的复合根目录,那么您在其中做了一些错误。很可能你正在做什么

kernel.Get<ISomeDependency>()
kernel.Get()

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

project 3是否需要使用DI容器?您不能将其依赖项注入其中,而不是让它自己解决它们吗?如果您不能,将DiContainer移动到project1中可能是有意义的,因为这是将这一切结合在一起的粘合剂。将project2接口移动到project1中也可能有意义,这样3就不需要依赖于project2。