2012-04-04 80 views
0

我是MVC,存储库概念和依赖注入的新手。Ninject,Repository和DAL

我的仓库和DAL看起来像

public interface IRepository<TEntity> where TEntity : class 
{ 
    List<TEntity> FetchAll(); 
    IQueryable<TEntity> Query { get; } 
    void Add(TEntity entity); 
    void Delete(TEntity entity); 
    void Save(); 
} 


public class Repository<T> : IRepository<T> where T : class 
{ 
    private readonly DataContext _db; 

    public Repository(DataContext db) 
    { 
     _db = db; 
    } 

    #region IRepository<T> Members 

    public IQueryable<T> Query 
    { 
     get { return _db.GetTable<T>(); } 
    } 

    public List<T> FetchAll() 
    { 
     return Query.ToList(); 
    } 

    public void Add(T entity) 
    { 
     _db.GetTable<T>().InsertOnSubmit(entity); 
    } 

    public void Delete(T entity) 
    { 
     _db.GetTable<T>().DeleteOnSubmit(entity); 
    } 

    public void Save() 
    { 
     _db.SubmitChanges(); 
    } 

    #endregion 
} 

在Global.asax文件我有

private void RegisterDependencyResolver() 
    { 
     var kernel = new StandardKernel(); 
     kernel. 
      Bind(typeof(IRepository<>)). 
      To(typeof(Repository<>)) 
      .WithConstructorArgument("db", new DataContext(ConfigurationManager.ConnectionStrings["ConnectionString"].ToString())); 
     DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel)); 
    } 

,但是当我试图访问资源库,我得到 “Object reference not set to an instance of an object”。我是否正确理解Repository和Injection应该如何工作?

public class AdminController : Controller 
    { 

     private readonly IRepository<User> _userRepository; 

     public ActionResult Index() 
     { 
      var a = _userRepository.FetchAll(); //I get exception here 
      return View(); 
     } 
} 
+0

有三种类型的依赖注入:通过构造函数,属性或参数。构造函数注入是你在这里需要的。查看我之前的问题的例子。 – 2012-04-04 11:26:37

回答

1

因为没有设置_userRepository,所以得到了nullref。它设置在AdminController类的构造函数和Niject会很乐意把它注射:

public class AdminController : Controller 
{ 
    private readonly IRepository<User> _userRepository; 
    public AdminController(IRepository<User> userRepository) 
    { 
     _userRepository = userRepository; 
    } 

    //... 
} 

你可以在这里阅读更多关于injection patterns with Ninjecthow injection works

0

在Web配置文件

<appSettings> 
    <add key="RepoSetting" value="Solution.DAL.OrderRepository"/> 
</appSettings> 

在ninject网页通用类

private static void RegisterServices(Ikernel Kernel) 
{ 
    //kernl.Bind<Irepo>().To<CustRepo>(); 

    string name = WebConfigurationManager.AppSettings["RepoSetting"]; 
    Type repoToInject = Assembly.GetExecutingAssembly().GetType(name); 

    kernel.Bind<ICustomerRepository>().To(repoToInject 
}