2012-04-04 8 views
0

Ich bin neu in MVC, Repository-Konzept und Dependency-Injektion.Ninject, Repository und DAL

sieht mein Repository und DAL wie

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 
} 

In Datei Global.asax I

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

haben, aber wenn ich bekomme ich "Object reference not set to an instance of an object" Ich versuche Repository zugreifen. Verstehe ich richtig, wie Repository und Injektion funktionieren sollten?

public class AdminController : Controller 
    { 

     private readonly IRepository<User> _userRepository; 

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

Es gibt drei Arten von Dependency Injection: über Konstruktor, die Eigenschaft oder Parameter. Konstruktorinjektion ist eine, die Sie hier brauchen. Sehen Sie sich mein Beispiel für Ihre vorherige Frage an. –

Antwort

1

Sie erhalten nullref, weil Sie _userRepository nicht festlegen. Legen Sie es in der AdminController Konstruktor und Niject wird es injizieren glücklich:

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

    //... 
} 

Sie die hier mehr über injection patterns with Ninject und how injection works lesen kann.

0

In der Web-Konfigurationsdatei

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

Im ninject Web gemeinsamen Klasse

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 
}