根据COMPOSITION ROOT模式,我必须尽可能地将所有依赖关系图构建到应用程序的入口点。
我的架构是面向插件的。所以,如果有人想扩展我的基础系统,他可以。
例如,在我的基础系统中,我有这样的结构:
在DAL中,我公开了一些类:
所以,我想如果一个插件想要将我的基础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对象......? 另一个问题是,如何在插件中注入对象实例,或者,插件如何自动注入基本系统组件的某些实例?
谢谢大家。 我会非常感激一些帮助。
答案 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。
我不知道我是否能很好地解释自己......
谢谢大家。