2012-04-04 3 views
0

Je suis nouveau sur MVC, le concept de référentiel et l'injection de dépendances.Ninject, Repository et DAL

Mon dépôt et DAL ressemble

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 
} 

Dans le fichier Global.asax je

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

mais quand je suis en train d'accéder au dépôt central je reçois "Object reference not set to an instance of an object". Est-ce que je comprends correctement comment le dépôt et l'injection devraient fonctionner?

public class AdminController : Controller 
    { 

     private readonly IRepository<User> _userRepository; 

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

Il existe trois types d'injection de dépendance: par le constructeur, la propriété ou paramètre. L'injection du constructeur est celle dont vous avez besoin ici. Voyez mon exemple pour votre question précédente. –

Répondre

1

Vous obtenez nullref car vous ne définissez pas _userRepository. Réglez-le dans le constructeur de la AdminController et Niject injectera joyeusement:

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

    //... 
} 

Vous pouvez lire plus sur le injection patterns with Ninject et how injection works.

0

Dans le fichier de configuration web

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

Dans le web ninject classe commune

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 
}