[ASP.NET MVC Mavericks Road] 05 - Utilisation de Ninject

黄舟
Libérer: 2016-12-30 14:08:48
original
1813 Les gens l'ont consulté

[ASP.NET
MVC Mavericks Road] 05 - Utilisation de Ninject

L'article précédent de la série [ASP.NET MVC Mavericks Road] (Dependency Injection (DI) et Ninject) mentionnait deux choses à faire lors de l'utilisation de Ninject dans ASP.NET
MVC Après cet article, cet article utilisera un exemple pratique pour démontrer l'application de Ninject dans ASP.NET MVC.

Afin de mieux comprendre et appréhender le contenu de cet article, il est fortement recommandé aux débutants de lire Dependency Injection (DI) et Ninject avant de lire cet article.

Répertoire de cet article :


Travail de préparation

Créez une nouvelle solution vierge nommée BookShop. Ajoutez une application MVC vide nommée BookShop.WebUI et un projet de bibliothèque de classes nommé BookShop.Domain à la solution. La structure des répertoires est la suivante :

[ASP.NET MVC Mavericks Road] 05 - Utilisation de Ninject

Une fois les deux projets ajoutés, ajoutez une référence au projet BookShop.Domain sous le projet BookShop.WebUI.

Utilisez NuGet pour installer le package Ninject pour le projet BookShop.WebUI et le projet BookShop.Domain respectivement (pour une introduction à NuGet, veuillez lire Dependency Injection (DI) et Ninject). Vous pouvez installer via la fenêtre visuelle ou ouvrir la console du gestionnaire de packages (Affichage->Autres fenêtres->Console du gestionnaire de packages) et exécuter la commande suivante pour installer :

Install-Package Ninject -Project BookShop.WebUI

Install-Package Ninject -Project BookShop.Domain

L'image suivante montre que l'installation est réussie :

[ASP.NET MVC Mavericks Road] 05 - Utilisation de Ninject

Créer une usine de contrôleurs

Nous savons que dans ASP.NET MVC, une demande client est traitée dans l'action d'un contrôleur spécifique. Par défaut, ASP.NET MVC utilise la classe de fabrique Controller intégrée DefaultControllerFactory pour créer une instance de Controller correspondant à une certaine requête. Parfois, la fabrique Controller par défaut ne peut pas répondre à nos besoins réels, nous devons donc étendre ce comportement par défaut, c'est-à-dire créer une classe de fabrique Controller personnalisée qui hérite de la classe DefaultControllerFactory et remplacer certaines de ses méthodes. Pour ce faire, nous créons un dossier nommé Infrastructure sous le projet BookShop.WebUI, et ajoutons une classe d'usine nommée NinjectControllerFactory dans le dossier. Le code est le suivant :

public class NinjectControllerFactory : DefaultControllerFactory {
    private IKernel ninjectKernel;

    public NinjectControllerFactory() {
        ninjectKernel = new StandardKernel();
        AddBindings();
    }

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) {
        return controllerType == null ? null : (IController)ninjectKernel.Get(controllerType);
    }

    private void AddBindings() {
        // todo:后面再来添加绑定
    }
}
Copier après la connexion
ninjectKernel dans le code ci-dessus .Get. (controllerType) peut obtenir une instance de Controller. L'instanciation manuelle de la classe Controller ici est un processus très compliqué. Nous ne savons pas si la classe Controller a un constructeur avec des paramètres, ni quels sont les types des paramètres du constructeur. Pour utiliser Ninject, il vous suffit d'utiliser la méthode Get ci-dessus. Ninject gérera automatiquement toutes les dépendances en interne et créera intelligemment les objets dont nous avons besoin.


Une fois la classe d'usine Controller créée, nous devons dire à MVC d'utiliser notre classe NinjectControllerFactory pour créer un objet Controller. Pour ce faire, ajoutez le code suivant à la méthode Application_Start du fichier Global.asax :

protected void Application_Start() {
    ......

    //设置Controller工厂
    ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());
}
Copier après la connexion
Ici, nous ne nous soucions pas du principe du code ci-dessus pour le moment. Sachez simplement que pour mettre en place une Controller factory personnalisée, vous devez vous inscrire ici. Si j'ai le temps, je vous expliquerai. cette partie dans un article de blog plus approfondi.


Ajouter un modèle de domaine

Dans une application MVC, tout tourne autour du modèle de domaine de. Nous avons donc créé un dossier nommé Entities dans le projet BookShop.Domain pour stocker le modèle d'entité de domaine. En tant que librairie en ligne de commerce électronique, l'entité de domaine la plus importante est bien entendu Book. Comme c'est juste à titre de démonstration, nous définissons simplement une classe Book et ajoutons cette classe dans le dossier Entités. Le code est le suivant : .

public class Book {
    public int ID { get; set; }
    public string Title { get; set; }
    public string Isbn { get; set; }
    public string Summary { get; set; }
    public string Author { get; set; }
    public byte[] Thumbnail { get; set; }
    public decimal Price { get; set; }
    public DateTime Published { get; set; }
}
Copier après la connexion

添加Repository

我们知道,我们肯定需要一种方式来从数据库中读取Book数据。在这我们不防为数据的使用者(这里指Controller)提供一个IBookRepository接口,在这个接口中声明一个IQueryable类型的属性Books。这样,通过该接口使用依赖注入,使用者就可以拿到Books数据集合,而不用关心数据是如何得到的。为此,我们在BookShop.Domain工程中添加一个名为 Abstract的文件夹,在该文件夹中添加我们的IBookRepository接口文件,代码如下:

public interface IBookRepository {
    IQueryable<Book> Books { get; }
}
Copier après la connexion

在MVC中我们一般会用仓储模式(Repository Pattern)把数据相关的逻辑和领域实体模型分离,这样对于使用者来说,通过调用仓储对象,使用者可以直接拿到自己想要的数据,而完全不必关心数据具体是如何来的。我们可以把仓储比喻成一个超市,超市已经为消费者供备好了商品,消费者只管去超市选购自己需要的商品,而完全不必关心这些商品是从哪些供应商怎么样运输到超市的。但对于仓储本身,必须要实现读取数据的“渠道”。

在BookShop.Domain工程中添加一个名为Concrete文件夹用于存放具体的类。我们在Concrete文件夹中添加一个实现了IBookRepository接口的BookRepository类来作为我们的Book数据仓储。BookRepository类代码如下:

public class BookRepository : IBookRepository {

    public IQueryable<Book> Books {
        get { return GetBooks().AsQueryable(); }
    }

    private static List<Book> GetBooks() {  
        //为了演示,这里手工造一些数据,后面会介绍使用EF从数据库中读取。
        List<Book> books = new List<Book>{
            new Book { ID = 1, Title = "ASP.NET MVC 4 编程", Price = 52},
            new Book { ID = 2, Title = "CLR Via C#", Price = 46},
            new Book { ID = 3, Title = "平凡的世界", Price = 37}
        };
        return books;
    }
}
Copier après la connexion

为了演示,上面是手工造的一些数据,后面的文章我将介绍使用Entity Framwork从数据库中读取数据。对于刚接触ORM框架的朋友可能对这里IQueryable感到奇怪,为什么用IQueryable作为返回类型,而不用IEnumerable呢?后面有机会讲Entity Framwork的时候再讲。

添加绑定

打开之前我们在BookShop.WebUI工程创建的NinjectControllerFactory类,在AddBindings方法中添加如下代码

private void AddBindings() {
    ninjectKernel.Bind<IBookRepository>().To<BookRepository>();
}
Copier après la connexion

这句代码,通过Ninject把IBookRepository接口绑定到BookRepository,当IBookRepository接口的实现被请求时,Ninject将自动创建BookRepository类的实例。

到这里,Ninject的使用步骤就结束了,接下来我们把本示例剩余的步骤完成。


显示列表

右击BookShop.WebUI工程的Controllers文件夹,添加一个名为Book的Controller,按下面代码对其进行编辑:

public class BookController : Controller {
    private IBookRepository repository;

    public BookController(IBookRepository bookRepository) {
        repository = bookRepository;
    }
}
Copier après la connexion

在这,BookController的构造函数接受了一个IBookRepository参数,当BookController被实例化的时候,Ninject就为其注入了BookRepository的依赖。接下来我们为这个Controller添加一个名为List的Action,用来呈现Book列表。代码如下:

public class BookController : Controller {
    ...

    public ViewResult List() {
        return View(repository.Books);
    }
}
Copier après la connexion

当然我们需要添加一个View。右击上面的List方法,选择添加视图,在弹出的窗口进行如下配置:

[ASP.NET MVC Mavericks Road] 05 - Utilisation de Ninject

然后我们在List.cshtml中用foreach循环来列举书本信息,代码如下:

@model IEnumerable<BookShop.Domain.Entities.Book>

@{
    ViewBag.Title = "Books";
}

@foreach (var p in Model) {  
    <div class="item" style="border-bottom:1px dashed silver;"> 
        <h3>@p.Title</h3> 
        <p>价格:@p.Price.ToString("c") </p>   
    </div>     
}
Copier après la connexion

最后我们还需要修改一下默认路由,让系统运行后直接导向到我们的{controller = "Book", action = "List"},打开Global.asax文件,找到RegisterRoutes方法,进行如下修改:

public static void RegisterRoutes(RouteCollection routes) {
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Default", // Route name 
        "{controller}/{action}/{id}", // URL with parameters 
        new { controller = "Book", action = "List", id = UrlParameter.Optional }
    );
}
Copier après la connexion

到这,我们的程序可以运行了,效果如下:

[ASP.NET MVC Mavericks Road] 05 - Utilisation de Ninject

Conclusion :

Cet article est un exemple simple d'utilisation de Ninject dans ASP.NET MVC. Le but est de permettre à tout le monde de comprendre comment utiliser Ninject dans MVC. Bien entendu, la puissance de Ninject ne se limite pas à ce qui est démontré dans cet article. Je pense qu'une fois familiarisé avec Niject, vous l'apprécierez certainement lors de la création d'applications MVC.

Ce qui précède est le contenu de [ASP.NET MVC Mavericks Road] 05 - Utilisation de Ninject Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal