2009-10-12 3 views
1

Je ne fais que commencer avec asp.net mvc. Il y a beaucoup de chemin à faire avant de pouvoir vraiment arriver à un projet en direct. En ce moment je travaille à construire un blog en utilisant le livre unleashed asp.net mvc.ASP.NET MVC: constructeurs de contrôleurs

Cependant, je ne comprends pas les 2 constructeurs dans le BlogController (voir question ci-dessous)

Thx ...

PREMIER

Le BlogController a une variable privée '_repository'

Private _repository As BlogRepositoryBase 

Public MustInherit Class BlogRepositoryBase 
    'blog entry methods 
    Public MustOverride Function ListBlogEntries() As List(Of BlogEntry) 
    Public MustOverride Sub CreateBlogEntry(ByVal BlogEntryToCreate As BlogEntry) 
    Public MustOverride Function QueryBlogEntries() As IQueryable(Of BlogEntry) 
End Class 
  • Le BlogReposi toryBase obtient hérité par EntityFrameworkBlogRepository _
  • Le EntityFrameworkBlogRepository se connecte avec BlogDBEntities

SUIVANT

Le contrôleur possède 2 constructeurs 'nouveau' et 'nouveau avec un paramètre'

Public Sub New() 
    Me.New(New EntityFrameworkBlogRepository()) 
End Sub 

Public Sub New(ByVal repository As BlogRepositoryBase) 
    _repository = repository 
End Sub 

QUESTIONS

  • Qu'est-ce qui se passe avec les constructeurs, je ne suis pas
  • Comment une classe de type « EntityFrameworkBlogRepository » être passé à « sous nouveau » comme BlogRepositoryBase? N'est-ce pas un autre type?

Répondre

3

Le constructeur par défaut appelle le constructeur avec un paramètre avec une nouvelle instance d'un type particulier de classe BlogRepositoryBase. EntityFrameworkBlogRepository doit dériver de cette classe de base. La raison pour laquelle vous spécifiez la classe de base (j'aurais utilisé une interface, mais je m'écarte) est que dans vos tests, vous pouvez spécifier un type différent de référentiel - un, peut-être, qui ne se connecte même pas à une base de données en instanciant directement via le constructeur non-défaut. Le framework utilisera toujours le constructeur par défaut, donc vous devez à la fois le fournir et fournir une implémentation appropriée du référentiel qui l'utilise. FWIW - c'est comme ça que je le ferais (en C# - mon cerveau ne fonctionne pas assez bien pour traduire en VB, pour l'instant).

protected IBlogRepository Repository { get; set; } 

public BlogController() : this(null) {} 

public BlogController(IBlogRepository repository) 
{ 
     this.Repository = repository ?? new EntityFrameworkBlogRepository(); 
     ... 
} 

soumis aux épreuves

public void Test() 
{ 
     var repository = MockRepository.GenerateMock<IBlogRepository>(); 

     var controller = new BlogController(repository); 

     ... 

     repository.VerifyAllExpectations(); 
} 
0

EntityFrameworkBlogRepository est dérivé de BlogRepositoryBase

La 'magie' dans les constructeurs est appelé Dependency Injection. En bref, c'est une façon de rendre votre code plus facile à maintenir et à tester en lui transmettant ses dépendances ... si vous changez le type de référentiel, vous n'avez pas besoin de déchirer la majeure partie de votre code.

Bonté,

Dan

Questions connexes