基于面向插件体系结构的Ninject-NHibernate

基于面向插件体系结构的Ninject-NHibernate,nhibernate,ninject,Nhibernate,Ninject,根据组合根模式,我必须构造尽可能靠近应用程序入口点的所有依赖关系图 我的架构是面向插件的。所以,如果有人想扩展我的基本系统,他可以 例如,在我的基本系统中,我有以下结构: 视图层 服务层 数据访问层 模型层 在DAL中,我公开了一些类,如: 间接的 NHibernateRepository 产品存储库 因此,我想知道插件是否希望将我的基本产品类扩展到ExtendedProduct,然后创建继承自NHibernateRepository的ExtendedProductRepository 问题是:

根据组合根模式,我必须构造尽可能靠近应用程序入口点的所有依赖关系图

我的架构是面向插件的。所以,如果有人想扩展我的基本系统,他可以

例如,在我的基本系统中,我有以下结构:

  • 视图层
  • 服务层
  • 数据访问层
  • 模型层
  • 在DAL中,我公开了一些类,如:

  • 间接的
  • NHibernateRepository
  • 产品存储库
  • 因此,我想知道插件是否希望将我的基本产品类扩展到ExtendedProduct,然后创建继承自NHibernateRepository的ExtendedProductRepository

    问题是: 如何使用NInject从我的基本系统实例化NHibernateRepository的实例

    因此,我知道要做的第一件事是构造图依赖关系:

    using (var kernel = new StandardKernel())
    {
        kernel.Bind(b => b.FromAssembliesMatching("*")
        .SelectAllClasses()
        .InheritedFrom<IRepository>()
        .BindAllInterfaces());
    }
    
    使用(var kernel=new StandardKernel())
    {
    Bind(b=>b.FromAssembliesMatching(“*”)
    .SelectAllClasses()
    .继承自()
    .BindAllInterfaces());
    }
    
    然而,我发现当我执行以下操作时:

    kernel.GetAll<IRepository>()
    
    kernel.GetAll()
    
    它将返回一个ProductRepository实例,以及两个IRepository对象下的另一个ProductExtendedRepository

    那么,如何从我的基本系统中保存ProductExtended对象。。。? 另一个问题是,我如何在我的插件中注入一个对象实例,或者,插件如何自动注入基本系统组件的某个实例

    谢谢大家。
    我将非常感谢您的帮助。

    我将此模式用于基于NHibernate的项目:

    public interface IRepository<T> : IQueryable<T>
    {
        T Get(int id);
        void Save(T item);
        void Delete(T item);
    }
    
    public class NHibernateRepository<ModelType> : IRepository<ModelType>
        where ModelType : class
    {
         // implementation
    }
    
    您的插件既可以获得基本功能,也不必注册任何内容:

    public PluginConstructor(IRepository<ProductExtended> repo { ... }
    
    public-PluginConstructor(IRepository-repo{…}
    
    或者创建自己的存储库并在Ninject模块中注册。

    谢谢dave

    太好了,我试试看

    但是,我如何从我的基本系统中保存、获取或更新(无论哪个IRepository方法)…一个ExtendedProduct实例

    思考以下问题:

    public interface BasePlugin<T> {...}
    
    公共接口基本插件{…}
    
    在另一个组件中:

    public class PluginExtendedProduct : BasePlugin<ExtendedProduct>
    {
        public PluginExtendedProduct (IRepository<ExtendedProduct> repo { ... }
    }
    
    公共类PluginExtendedProduct:BasePlugin
    {
    公共PluginTrendedProduct(IRepository repo{…}
    }
    
    我最头疼的是如何在我的基本系统中创建(因此,ExtendedProduct)的实例,以便调用使用IRepository的方法PluginExtendedProduct

    我不知道我是否解释得很好


    谢谢大家。

    这正是您要做的。
    IRepository
    将在没有任何附加绑定的情况下被注入,因为
    IRepository
    已经绑定。仅供参考,您通常会在答案中添加问题作为注释,而不是发布其他答案。
    public Constructor(IProductRepository repo) { ... }
    
    public PluginConstructor(IRepository<ProductExtended> repo { ... }
    
    public interface BasePlugin<T> {...}
    
    public class PluginExtendedProduct : BasePlugin<ExtendedProduct>
    {
        public PluginExtendedProduct (IRepository<ExtendedProduct> repo { ... }
    }