0

N在这里注入菜鸟。很抱歉后面的代码墙,但这里有很多活动部分。

我有一个命名空间,它定义了我想要编程的实现不可知的持久性接口。顶层界面如下所示:

namespace Common.PersistenceStrategy
{
    public interface IPersistenceStrategy
    {
        IPersistenceRepositoryInstructionResult Commit();

        IPersistenceRepository<T> repositories<T>() where T : class;
    }
}

该接口的通用 EF 实现位于它自己的命名空间和项目中:

namespace Common.PersistenceStrategy.EF
{
    public class EFPersistenceStrategy : IPersistenceStrategy 
    {
        protected DbContext _context;

        public EFPersistenceStrategy(DbContext context)
        {
            _context = context;
        }
        //Other Implementation stuff...
}

特定于项目的实现获得它自己的命名空间和项目。这个想法是覆盖一些通用/默认的 EF 行为,并在当前项目中充当 EF 依赖的单点。

namespace MyProject.DAL
{
    public class MyProjectPersistenceStrategy : EFPersistenceStrategy
    {
        public MyProjectPersistenceStrategy() : base(new MyProjectDbContext())
        {}
        //project specific implementation overrides
    }
}

到达那里...在使用/使用 MyProjectPersistenceStrategy 的网站中,控制器继承自此类:

namespace MyProject.Site.Controllers
{
    public abstract class ControllerWithUnitOfWork : Controller
    {
        [Inject]
        public IPersistenceStrategy _persistenceStrategy { get; set; }
        //other implementation stuff
    }
}

最后,这是将 IPersistenceStrategy 连接到 MyProjectPersistenceStrategy 的 NInject 内核代码:

private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<IPersistenceStrategy>().To<BlackoutPersistenceStrategy>();

    }

因此,我收到两条与内核绑定部分相关的错误消息:

Error   3   The type 'Common.PersistenceStrategy.EF.EFPersistenceStrategy' is defined in an assembly that is not referenced. You must add a reference to assembly 'Common.PersistenceStrategy.EF...

Error   6   The type 'MyProject.DAL.MyProjectPersistenceStrategy' cannot be used as type parameter 'TImplementation' in the generic type or method 'Ninject.Syntax.IBindingToSyntax<T1>.To<TImplementation>()'. There is no implicit reference conversion from 'MyProject.DAL.MyProjectPersistenceStrategy' to 'Common.PersistenceStrategy.IPersistenceStrategy'.   C:\dev\Blackout\Blackout.Site\App_Start\NinjectWebCommon.cs

MyProject.Site 已经获得了对 MyProject.DAL 和 Common.Persistence 的引用,这很好而且很明智。

如果我从我的 Web 项目中引用 Common.Persistence.EF,这两个错误都会消失。不过,这并不是真正的跑步者,因为依赖注入工作的重点是将 EF 的依赖隔离到当前项目中的单个模块。似乎 NInject 不能走 MyProjectPersistenceStrategy 和 IPersistenceStrategy 之间的关系链,除非它可以看到两者之间的整个类树?有没有直接的解决方案,或者我想在这里做错事?干杯。

4

2 回答 2

0

这不是 Ninject 问题。这是构建过程(编译)问题。Common.PersistenceStrategy.EF.EFPersistenceStrategy如果缺少引用,则无法构建 Web 项目,因为MyProject.DAL.MyProjectPersistenceStrategy继承自那里定义的类。

评论

想象一下构建应用程序后的 bin 文件夹。它必须包含Common.PersistenceStrategy.EF.dll运行您的应用程序(实际上它必须包含所有未在 GAC 中注册的必需 dll)。因此,MsBuild 希望您声明对该项目 dll 的引用,因为他从*.csproj文件中读取构建应用程序所需的 dll。在我看来,<ProjectReference Include="..\MyProject\MyProject.csproj">*.csproj 内部只是指出 MSBuild 它应该首先在该引用的构建脚本上运行构建,但不会查看其中的其他引用。事实上,如果你在 VS 中查看引用项目的属性,路径指向该项目的 bin 文件夹。

于 2012-12-11T08:14:28.390 回答
0

通过在 .DAL 和 .Site 命名空间之间添加一个新程序集(仅包含一个 NInject 模块)来解决此问题。

这个新程序集在一个可交换的球中包含所有持久性实现依赖项,因此 .Site 命名空间只需要引用它并且 .Site 使用的接口(在本例中为 Common.Persistence )。

于 2012-12-12T16:38:45.720 回答