1

想象一下,我有一个包含 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 中配置依赖项吗?

4

2 回答 2

2

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

kernel.Get<ISomeDependency>()

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

于 2012-05-23T10:21:24.947 回答
1

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

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

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

编辑

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

于 2012-05-23T10:01:14.833 回答