2012-04-04 79 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 
}