2012-04-04 13 views
0

私はMVC、リポジトリのコンセプトと依存性注入が初めてです。Ninject、Repository and DAL

マイリポジトリとDALは、Global.asaxファイルで

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 
} 

のように見える私は

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" を取得します。リポジトリとインジェクションの仕組みを正しく理解していますか?

public class AdminController : Controller 
    { 

     private readonly IRepository<User> _userRepository; 

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

依存性注入の3つのタイプがありますコンストラクタ、プロパティ、またはパラメータ経由で。コンストラクタインジェクションはここで必要なものです。前の質問について私の例を見てください。 –

答えて

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について読むことができます。 Web構成ファイルで

0

<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 
}