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