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 之间的关系链,除非它可以看到两者之间的整个类树?有没有直接的解决方案,或者我想在这里做错事?干杯。