Ninject NHibernate基于插件的架构

时间:2015-07-08 09:29:05

标签: nhibernate ninject

根据COMPOSITION ROOT模式,我必须尽可能地将所有依赖关系图构建到应用程序的入口点。

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

例如,在我的基础系统中,我有这样的结构:

  1. 查看图层
  2. 服务层
  3. 数据访问层
  4. 模型层
  5. 在DAL中,我公开了一些类:

    1. IRepository
    2. NHibernateRepository
    3. ProductRepository
    4. 所以,我想如果一个插件想要将我的基础Product类扩展到ExtendedProduct,然后创建继承自NHibernateRepository的ExtendedProductRepository。

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

      所以,我知道要做的第一件事是构建图依赖项:

      using (var kernel = new StandardKernel())
      {
          kernel.Bind(b => b.FromAssembliesMatching("*")
          .SelectAllClasses()
          .InheritedFrom<IRepository>()
          .BindAllInterfaces());
      }
      

      但是,当我执行类似的事情时,我会搞清楚:

      kernel.GetAll<IRepository>()
      

      它将返回一个ProductRepository实例,以及两个IRepository对象下的另一个ProductExtendedRepository。

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

      谢谢大家。 我会非常感激一些帮助。

2 个答案:

答案 0 :(得分:0)

我将这种模式用于基于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 interface IProductRepository : IRepository<Product> 
{
    // product specific data access methods
}

public class ProductRepository : NHibernateRepository<Product>, IProductRepository
{
    // implementation 
}

......并在Ninject模块中:

Bind(typeof(IRepository<>)).To(typeof(NHibernateRepository<>));
Bind<IProductRepository>().To<ProductRepository>();

然后您可以请求基本功能,如:

public Constructor(IRepository<Product> repo) { ... }

或特定产品存储库功能:

public Constructor(IProductRepository repo) { ... }

您的插件可以获得基本功能,也不必注册任何内容:

public PluginConstructor(IRepository<ProductExtended> repo { ... }

或创建自己的存储库并在Ninject模块中注册它们。

答案 1 :(得分:0)

谢谢戴夫。

它非常完美。我试试吧。

但是,我如何保存或获取或更新(无论哪种IRepository方法)......来自我的基础系统的ExtendedProduct实例?

想想以下几点:

public interface BasePlugin<T> {...}

在另一个集会中:

public class PluginExtendedProduct : BasePlugin<ExtendedProduct>
{
    public PluginExtendedProduct (IRepository<ExtendedProduct> repo { ... }
}

我头疼的是如何在我的基础系统中创建(所以,ExtendedProduct)的实例,以便调用使用IRepository的方法PluginExtendedProduct。

我不知道我是否能很好地解释自己......

谢谢大家。