我非常新,但是我正在尝试用结构图学习nhibernate和DI,所以我正在制作一个应用来测试一切。
我在将我的unitofwork注入我的基础存储库时遇到了一些问题。我在每个请求上创建一个unitofwork,然后在最后提交或回滚。但是当我尝试注入我的基础存储库时,当我在我的方法中使用它时,它总是为null。更具体地说,我得到这个错误:“对象引用未设置为对象的实例”。任何想法我做错了,如果这是我应该去的正确路线?
非常感谢提前。
Base Repository:
public abstract class Repository<T> : IRepository<T>
{
public readonly IUnitOfWork _unitOfWork;
public Repository(IUnitOfWork UnitOfWork)
{
UnitOfWork = _unitOfWork;
}
public Repository() {}
public void Save(T obj)
{
_unitOfWork.CurrentSession.Save(obj);
}
}
我的application_start中设置的StructureMap注册表:
public class NHibernateRegistry : Registry
{
public NHibernateRegistry()
{
For<IUnitOfWork>().HybridHttpOrThreadLocalScoped().Use<UnitOfWork>();
For<ISession>().HybridHttpOrThreadLocalScoped().Use(context => context.GetInstance<ISessionFactory>().OpenSession());
For<ISessionFactory>().Singleton().Use(NHibernateSessionFactory.GetSessionFactory());
}
}
更新
baserepository由特定的存储库继承,即ArticleRepository然后将其注入到application_start上的aspx页面中。然后我的aspx页面继承了buildUp发生的基页。我像这样访问存储库:
public IArticleRepository ArticleRepo { get; set; }
public void SaveThing()
{
ArticleRepo.Save(object);
}
这会在application_start上调用:
public class Bootstrapper
{
public static void BootStrap()
{
ObjectFactory.Configure(x =>
{
x.AddRegistry<NHibernateRegistry>();
x.AddRegistry<WebRegistry>();
});
}
}
在网络注册中:
For<IArticleRepository>().Use<ArticleRepository>();
答案 0 :(得分:3)
您的ArticleRepository
很可能没有以IUnitOfWork
为参数的构造函数,以确保您拥有以下内容
public class ArticleRepository : Repository<Article>
{
public ArticleRepository(IUnitOfWork unitOfWork) : base(unitOfWork)
{
}
...
}
记住Strcuture map使用它实例化的类上最贪婪的构造函数。由于您的抽象存储库类永远不会被实例化,因此它不会使用其构造函数。如果您的类需要以这种方式注入其依赖项,我还建议不要使用任何默认构造函数。错误发生的可能性更小。
答案 1 :(得分:1)
public readonly IUnitOfWork _unitOfWork;
public Repository(IUnitOfWork UnitOfWork)
{
UnitOfWork = _unitOfWork;
}
我认为你的意思是写
public readonly IUnitOfWork _unitOfWork;
public Repository(IUnitOfWork UnitOfWork)
{
_unitOfWork = UnitOfWork;
}
您将局部变量分配给参数而不是局部变量的参数。
编辑:你也应该用小写的U'unitOfWork'而不是'UnitOfWork'来编写你的参数