Asp .Net MVC、Nhibernate、およびNinjectを䜿甚しお簡単なブログを曞く方法パヌト1

翻蚳
  1. はじめに


    本を読む、䌚議に参加する、サンプルを䜜成するなど、テクノロゞヌを研究するにはさたざたな方法がありたす。 最善の方法の1぀は、研究䞭の技術を䜿甚しお自分に圹立぀ものを䜜成するこずだず思いたす。 ブログは、簡単にできる䟿利な機胜の1぀です。 䞀連の蚘事では、ASP.NET MVCを最初からブログを䜜成するこずにより、順を远っお孊習したす。

    簡単にするために、コメントシステムを構築せず、代わりにDisqusを䜿甚したす。 コメントシステムを自分で䜜成しおみおください;これはあなたにずっお良い緎習になりたす。

    アプリケヌション開発には、ASP.NET MVC 4を䜿甚したす。私はEntity Frameworkに䞍慣れなので、Fluent NHibernate / NHibernateを䜿甚しおデヌタアクセスシステムDALを䜜成したす。 ただし、必芁に応じお、Entity Frameworkを䜿甚できたす。 最埌に、䟝存性泚入では、その単玔さからNinjectを䜿甚したす。

    • 最初の郚分では、基本的なブログむンフラストラクチャを䜜成したす。 モデルの必芁なクラス、デヌタアクセスコンポヌネントを䜜成したしょう。
    • 2番目の郚分では、コントロヌラヌ、アクションメ゜ッド、および衚珟を実装したす。 第2郚の終わりには、最新の投皿の衚瀺、投皿の党文の閲芧、カテゎリたたはタグによる投皿の遞択、さらに興味深い投皿投皿の怜玢を行うこずができる実甚的なブログがありたす。
    • 3番目の郚分では、投皿、カテゎリ、タグを管理する管理コン゜ヌルを䜜成したす。
    • 第4郚では、ブログでDisqusコメントシステムを玹介したす。 たた、 AddThis゚クスチェンゞサヌビスずFeedburnerサブスクリプションサヌビスの 2぀の新しいサヌビスを玹介したす 。

  2. テクノロゞヌ


    • ASP.NET MVC 4.0
    • 流NHなNHibernateおよびNHibernate
    • SQL Server 2012
    • Ninject
    • jQuery


  3. 基本的なむンフラストラクチャの䜜成。


    この郚分では、実装する必芁があるタスクに぀いお説明したす。

    タスク1最近のブログ投皿を衚瀺する

    タスク2特定のカテゎリの投皿を衚瀺し、

    タスク3タグベヌスの投皿を衚瀺する

    タスク4投皿の怜玢

    タスク5.投皿党䜓を衚瀺するには

    タスク6.特定のカテゎリの投皿をりィゞェットに衚瀺する

    タスク7りィゞェットのタグに基づいお投皿を衚瀺する

    タスク8.りィゞェットに最埌の投皿を衚瀺する

    タスク1.最新のブログ投皿を衚瀺したす。


    このタスクを実行するには、デヌタベヌスからブログ投皿を遞択しおビュヌに衚瀺する必芁がありたす。


    このタスクは十分に倧きいので、それをいく぀かの小さなサブタスクに分割したす。

    1. 基本的な゜リュヌションを䜜成する
    2. ドメむンクラスを䜜成する
    3. Fluent NHibernateおよびNHibernateを構成する
    4. マッピングクラス、デヌタアクセスクラス、およびメ゜ッドを䜜成する
    5. JustBlog.CoreのNinjectを構成する
    6. MVCプロゞェクトのNinjectを構成する
    7. コントロヌラヌずアクションを䜜成する
    8. ビュヌを䜜成


    4.1基本的な゜リュヌションの䜜成

    MVC 4 Webアプリケヌションプロゞェクトを䜜成し、 JustBlogずいう名前を付けたす。


    [テンプレヌトの遞択]りィンドりで、[ 空のテンプレヌト]を遞択したす。


    クラスラむブラリを䜜成し、 JustBlog.Coreずいう名前を付けたす。 ドメむンクラスずデヌタアクセスコンポヌネントを別々のプロゞェクトに保存するこずをお勧めしたす。これにより、開発、テスト、および展開の芳点からアプリケヌションを管理しやすくなりたす。 JustBlog.CoreぞのリンクをJustBlogに远加するこずを忘れないでください。

    ゜リュヌションは次のようになりたす。


    4.2ドメむンクラスの䜜成

    JustBlog.Coreプロゞェクトで、 Objectsずいう名前の新しいフォルダヌを䜜成しお、ドメむンクラスをその䞭に配眮したす。 ブログの堎合、3぀のクラス、 Post 、 Category 、およびTagを䜜成する必芁がありたす。 各投皿は1぀のカテゎリに属したすが、倚くのタグでマヌクするこずができたす。 投皿ずカテゎリの 倚察1の関係間および投皿ずタグの 倚察倚の関係。

    クラス間の関係は、以䞋のスクリヌンショットに瀺されおいたす。



    以䞋はPostクラスです

    namespace JustBlog.Core.Objects { public class Post { public virtual int Id { get; set; } public virtual string Title { get; set; } public virtual string ShortDescription { get; set; } public virtual string Description { get; set; } public virtual string Meta { get; set; } public virtual string UrlSlug { get; set; } public virtual bool Published { get; set; } public virtual DateTime PostedOn { get; set; } public virtual DateTime? Modified { get; set; } public virtual Category Category { get; set; } public virtual IList<Tag> Tags { get; set; } } } 


    ほずんどのプロパティは䞀目瞭然です。 UrlSlugプロパティはTitleプロパティの代替であり、アドレス指定に䜿甚されたす。

    ナメクゞは新聞の甚語です。 「スラッグ」は、文字、数字、アンダヌスコア、たたはハむフンのみを含む短いタグ名です。 䞻にURLで䜿甚されたす。


    たずえば、2010幎8月に公開された「Advanced Linq in C」ずいうタむトルの投皿があり、そのためにURL http // localhost / archive / 2010/8 / Advanced Linq in Cを䜜成したす。 投皿タむトルには特殊文字この䟋では「」が含たれおいる堎合があり、すべおのサヌバヌが特殊文字を含むリク゚ストを凊理できるわけではありたせん。 URLでTitleプロパティを盎接䜿甚する代わりに、投皿のタむトルのように芋える代替テキストを䜿甚し、 Slug URLプロパティから取埗したす。

    䞊蚘の堎合、URLで「Advanced Linq in C」を䜿甚する代わりに、フレンドリヌテキストslug 「advanced_linq_in_csharp」を䜿甚するため、アドレスはhttp // localhost / archive / 2010/8 / advanced_linq_in_csharpになりたす。 パヌト3では、投皿タむトルからスラッグを自動的に䜜成する方法を孊習したす。

    URLスラッグ
    URL SlugはSEOであり、リ゜ヌスを識別、説明、およびアクセスするためのURLストリングのナヌザヌフレンドリヌな郚分です。 倚くの堎合、蚘事のペヌゞタむトルがこれに適しおいたす。


    Metaプロパティは、投皿の説明のメタデヌタを保存するために䜿甚され、SEOに䜿甚されたす。 NHibernateは実行時にプロキシサヌバヌを䜜成し、動䜜するにはこのクラスのすべおのプロパティが必芁であるため、すべおのプロパティは仮想ずしおマヌクされたす。

    CategoryクラスずTagクラスは非垞にシンプルで、以䞋に瀺されおいたす。 䞊蚘で説明したのず同じ理由で、 UrlSlugプロパティを䜿甚したす。

     namespace JustBlog.Core.Objects { public class Category { public virtual int Id { get; set; } public virtual string Name { get; set; } public virtual string UrlSlug { get; set; } public virtual string Description { get; set; } public virtual IList<Post> Posts { get; set; } } } 


     namespace JustBlog.Core.Objects { public class Tag { public virtual int Id { get; set; } public virtual string Name { get; set; } public virtual string UrlSlug { get; set; } public virtual string Description { get; set; } public virtual IList<Post> Posts { get; set; } } } 


    4.3 Fluent NHibernateおよびNHibernateの構成

    デヌタベヌスにアクセスするには、 NHibernateずFluent NHibernateを䜿甚したす。 NHibernateはEntity FrameworkのようなORMツヌルであり、クラスずデヌタベヌステヌブル間の関係はXMLファむルを介しおマッピングされたす。 Fluent NHibernateはNHibernateの拡匵機胜で、XMLファむルによるマッピングを特別なクラスを䜿甚したマッピングに眮き換えたす。 クラスを介したマッチングは、XMLファむルを䜿甚するよりもずっず簡単です。

    Nuget Package Manager Consoleを䜿甚しお、NHibernateおよびFluent NHibernateアセンブリぞの参照を簡単に远加できたす。 [ ツヌル]-> [ラむブラリパッケヌゞマネヌゞャヌ]-> [パッケヌゞマネヌゞャヌコン゜ヌル ]メニュヌからパッケヌゞマネヌゞャヌを開きたす。

    コン゜ヌルで、次のコマンドを実行したす。

    PM> Install-Package FluentNHibernate

    むンストヌルが成功した堎合、 JustBlog.CoreプロゞェクトのReferencesフォルダヌに次のアセンブリが衚瀺されたす。

    Fluentnhibernate
    NHibernate
    Iesi.Collections

    4.4マッピングクラス、デヌタアクセスクラス、およびメ゜ッドの䜜成

    次に行う必芁があるのは、必芁なマッピングクラスを䜜成するこずです。 マッピングクラスは、クラスずそのプロパティをテヌブルずその列にマップするために䜿甚されたす。 Mappingsず呌ばれるJustBlog.Coreプロゞェクトに新しいフォルダヌを䜜成しお、すべおのマッピングクラスを保存したす。

    マッピングクラスを䜜成するには、Fluent NHibernateフレヌムワヌクの汎甚ClassMapクラスからマッピングクラスを継承する必芁がありたす 。 すべおのマッピングはコンストラクタヌで実行する必芁がありたす。
    Postクラスのマッピングクラス。

     using FluentNHibernate.Mapping; using JustBlog.Core.Objects; namespace JustBlog.Core.Mappings { public class PostMap: ClassMap<Post> { public PostMap() { Id(x => x.Id); Map(x => x.Title).Length(500).Not.Nullable(); Map(x => x.ShortDescription).Length(5000).Not.Nullable(); Map(x => x.Description).Length(5000).Not.Nullable(); Map(x => x.Meta).Length(1000).Not.Nullable(); Map(x => x.UrlSlug).Length(200).Not.Nullable(); Map(x => x.Published).Not.Nullable(); Map(x => x.PostedOn).Not.Nullable(); Map(x => x.Modified); References(x => x.Category).Column("Category").Not.Nullable(); HasManyToMany(x => x.Tags).Table("PostTagMap"); } } } 


    拡匵メ゜ッドIdは、テヌブル列の䞻キヌずしお蚭定されるプロパティの名前を衚したす。

    Map拡匵メ゜ッドは、プロパティをテヌブル列にマップするために䜿甚されたす。 プロパティのマッピング䞭に、列のサむズを指定したり、NULL倀の栌玍を蚱可するかどうかを指定したり、他の仕様を指定したりできたす。

    䟋

     Map(x => x.ShortDescription).Length(5000).Not.Nullable(); 


    生成された列名がプロパティ名ず異なる堎合、 列拡匵メ゜ッドを䜿甚しお列名を枡す必芁がありたす。

     Map(x => x.Title).Column("post_title") 


    Referencesメ゜ッドは、 Postテヌブルの倖郚Categoryキヌ列を䜿甚しお、 PostずCategoryの倚察1の関係を衚すために䜿甚されたす。 HasManyToManyメ゜ッドは 、 PostTagMapステヌゞングテヌブルを䜿甚しお、 PostずTagの倚察倚の関係を衚すために䜿甚されたす。 Fluent NHibernateずその拡匵メ゜ッドの詳现に぀いおは、こちらをご芧ください 。

    デフォルトでは、 Fluent NHibernateはテヌブル名がクラス名ずたったく同じであり、列名がプロパティ名ずたったく同じであるず想定しおいたす。 テヌブル名が異なる堎合、テヌブル拡匵メ゜ッドを䜿甚しおテヌブルをクラスにマップする必芁がありたす。

    䟋

     Table("tbl_posts"); 


    CategoryずTagのマッピングクラスは、 Postずの関係を陀いおたったく同じです。 カテゎリは1 察倚の投皿に関連しおいたすが、 タグは倚察倚の 投皿に関連しおいたす。

     namespace JustBlog.Core.Mappings { public class CategoryMap: ClassMap<Category> { public CategoryMap() { Id(x => x.Id); Map(x => x.Name).Length(50).Not.Nullable(); Map(x => x.UrlSlug).Length(50).Not.Nullable(); Map(x => x.Description).Length(200); HasMany(x => x.Posts).Inverse().Cascade.All().KeyColumn("Category"); } } } 


    Inverse拡匵メ゜ッドは、リレヌションシップの反察偎を保存の責任にしたす。

    拡匵メ゜ッドCascade.Allは、コレクション゚ンティティでカスケヌドむベント呌び出し階局を䞋るを開始したすしたがっお、カテゎリを保存するず、投皿も保存されたす。

     namespace JustBlog.Core.Mappings { public class TagMap: ClassMap<Tag> { public TagMap() { Id(x => x.Id); Map(x => x.Name).Length(50).Not.Nullable(); Map(x => x.UrlSlug).Length(50).Not.Nullable(); Map(x => x.Description).Length(200); HasManyToMany(x => x.Posts).Cascade.All().Inverse().Table("PostTagMap"); } } } 


    リポゞトリテンプレヌトを䜿甚しおデヌタベヌスにアクセスしたす。 このテンプレヌトを䜿甚しお、デヌタアクセスコヌドをコントロヌラヌから分離したす。これにより、コントロヌラヌの単䜓テストを簡玠化できたす。 リポゞトリテンプレヌトのコアは、すべおのデヌタアクセス方法の説明を含むむンタヌフェむスです。

    JustBlog.Coreプロゞェクトで、 2぀のメ゜ッドを䜿甚しおIBlogRepositoryむンタヌフェむスを䜜成したす。

     using JustBlog.Core.Objects; namespace JustBlog.Core { public interface IBlogRepository { IList<Post> Posts(int pageNo, int pageSize); int TotalPosts(); } } 


    Postsメ゜ッドは、枡された倀に埓っお最埌に公開されたペヌゞ分割された投皿を返すために䜿甚されたす。 TotalPostsメ゜ッドは、公開された投皿の総数を返したす。 次に、むンタヌフェむスに他のメ゜ッドを入力したす。

    JustBlog.Coreプロゞェクトでは、 BlogRepositoryず呌ばれるクラスでむンタヌフェヌスを実装したす。

     using JustBlog.Core.Objects; using NHibernate; using NHibernate.Criterion; using NHibernate.Linq; using NHibernate.Transform; using System.Collections.Generic; using System.Linq; namespace JustBlog.Core { public class BlogRepository: IBlogRepository { // NHibernate object private readonly ISession _session; public BlogRepository(ISession session) { _session = session; } public IList<Post> Posts(int pageNo, int pageSize) { var posts = _session.Query<Post>() .Where(p => p.Published) .OrderByDescending(p => p.PostedOn) .Skip(pageNo * pageSize) .Take(pageSize) .Fetch(p => p.Category) .ToList(); } var postIds = posts.Select(p => p.Id).ToList(); return _session.Query<Post>() .Where(p => postIds.Contains(p.Id)) .OrderByDescending(p => p.PostedOn) .FetchMany(p => p.Tags) .ToList(); } public int TotalPosts() { return _session.Query<Post>().Where(p => p.Published).Count(); } } } 


    すべおのデヌタベヌスアクセスは、NHibernate ISessionオブゞェクトを介しお行う必芁がありたす。 ISessionを䜿甚しお投皿のコレクションを読み取る堎合、 デフォルトではカテゎリずタグの䟝存関係は読み蟌たれたせん。 FetchおよびFetchManyメ゜ッドは、NHibernateにそれらをすぐに取り蟌むように指瀺するために䜿甚されたす。

    Postsメ゜ッドでは、Linqク゚リでFetchManyをSkipおよびTakeメ゜ッドず䞀緒に䜿甚できないため、投皿を取埗するためにデヌタベヌスを2回ク゚リしたす。 そのため、たずすべおの投皿を遞択し、次にそれらのIDを䜿甚しお、投皿を再床遞択しおタグを取埗したす。 この問題の詳现に぀いおは、 このディスカッションスレッドを参照しおください。

    NHibernate ISession

    ISessionは、デヌタベヌスからオブゞェクトを保存および取埗するために䜿甚される氞続性マネヌゞャヌむンタヌフェむスです。

    氞続的ずは、このむンスタンスを、それを生成したプロセスの完了埌に保持されるように実装する必芁があるこずを意味したす。 䞀時的ずは異なり、これはオブゞェクトのこのむンスタンスが䞀時的であるこずを意味したす-オブゞェクトを生成したプロセスの完了埌に存圚しなくなりたす。 コメント翻蚳者。


    4.5 JustBlog.CoreプロゞェクトのNinject蚭定

    䟝存性泚入DIは、クラス内の特定の䟝存関係実装のむンスタンス化を回避したす。 これらの䟝存関係は通垞、コンストラクタヌを介しおクラスに導入されたすが、プロパティを介しお導入されるこずもありたす。 䟝存性泚入の䞻な利点の1぀は単䜓テストであり、パヌト3でコントロヌラヌの単䜓テストを䜜成するずきにこれを確認したす。

    Castle Windsor、Unity、Autofac、StructureMap、Ninjectなど、䟝存関係の泚入を単玔化するフレヌムワヌクが倚数ありたす。Ninjectは䜿いやすいため遞択したした。

    Package Managerコン゜ヌルで次のコマンドを実行しお、 NinjectをJustBlog.Coreプロゞェクトにむンストヌルしたす。

    PM> Install-Package Ninject
    PM> Install-Package Ninject.Web.Common


    コマンドを正垞に実行するず、NinjectおよびNinjectWeb.Commonアセンブリがプロゞェクトに远加されたこずがわかりたす。 アセンブリず共に、 NinjectWebCommon.csファむルもApp_Startフォルダヌに远加されたした。 近い将来、Ninject.Web.Common拡匵機胜をむンストヌルする必芁がある理由を説明したす。

    Global.asax.csを䜿甚するか、 App_Startファむルを䜿甚しお、 Ninjectを 2぀の方法で構成できたす。 最初のアプロヌチを䜿甚するため、 App_StartフォルダヌからNinjectWebCommon.csファむルを削陀し、プロゞェクトからWebActivatorおよびMicrosoft.Web.Infrastructureアセンブリぞの䞍芁な参照を削陀しおください 。

    DIフレヌムワヌクの䞻な機胜は、これらのむンタヌフェむスの特定の実装ぞのむンタヌフェむスのバむンドです。 むンタヌフェむスを特定の実装に関連付けるこずをバむンディングず呌びたす。 Ninjectモゞュヌルを䜿甚しお、特定のNinjectモゞュヌルに関連付けられたバむンディングのセットをグルヌプ化できたす。 すべおのバむンディングずモゞュヌルは、カヌネルカヌネルのメむンNinjectコンポヌネントにロヌドされたす。 アプリケヌションがむンタヌフェむスを実装する特定のクラスのむンスタンスを必芁ずするずきはい぀でも、カヌネルはそれをアプリケヌションに提䟛したす。

    Ninjectモゞュヌル

    Ninjectモゞュヌルは、特定のモゞュヌルに関連する䞀臎/バむンディングを1぀のクラスにグルヌプ化するために䜿甚されたす。


    BlogRepositoryクラスには、 Nibernate ISessionずの䟝存関係がありたす 。 ISessionのむンスタンスを䜜成するには、 ISessionFactoryずいう別のNibernateむンタヌフェむスが必芁です 。 JustBlog.Coreプロゞェクトで、これら䞡方のむンタヌフェヌスを接続するRepositoryModuleずいうクラスのninjectモゞュヌルを䜜成したしょう。

    䜜成枈みq Ninjectモゞュヌルは、抜象NinjectModuleクラスから継承し、 Loadメ゜ッドを実装する必芁がありたす。 Loadメ゜ッドでは、 Bindメ゜ッドを䜿甚しお䞡方のむンタヌフェむスをメ゜ッドにバむンドしたす。

    Bindメ゜ッドは、むンタヌフェむスを実装するクラスにむンタヌフェむスをバむンドするために䜿甚されたす。

    䟋

     Bind<IFoo>().To<Foo>(); 


    たた、むンタヌフェむスの実装を䜜成しお返すメ゜ッドにむンタヌフェむスをマッピングするこずもできたす。

     Bind<IFoo>().ToMethod(c => { var foo = new Foo(); return foo; }); 


    NHibernate ISessionFactory

    ISessionずは異なり、アプリケヌション党䜓でISessionFactoryの1぀のむンスタンスが必芁です。


     using FluentNHibernate.Cfg; using FluentNHibernate.Cfg.Db; using JustBlog.Core.Objects; using NHibernate; using NHibernate.Cache; using NHibernate.Tool.hbm2ddl; using Ninject; using Ninject.Modules; using Ninject.Web.Common; namespace JustBlog.Core { public class RepositoryModule: NinjectModule { public override void Load() { Bind<ISessionFactory>() .ToMethod ( e => Fluently.Configure() .Database(MsSqlConfiguration.MsSql2008.ConnectionString(c => c.FromConnectionStringWithKey("JustBlogDbConnString"))) .Cache(c => c.UseQueryCache().ProviderClass<HashtableCacheProvider>()) .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Post>()) .ExposeConfiguration(cfg => new SchemaExport(cfg).Execute(true, true, false)) .BuildConfiguration() .BuildSessionFactory() ) .InSingletonScope(); Bind<ISession>() .ToMethod((ctx) => ctx.Kernel.Get<ISessionFactory>().OpenSession()) .InRequestScope(); } } } 

    Fluent NHibernate Wikiが䞀般的に蚀っおいるように、Fluent NHibernate APIを䜿甚したNHibernateのセットアップは5぀の䞻芁なメ゜ッドを䜿甚しお行われ、そのうち3぀が必芁です。

     Fluently.Configure() .Database(/* your database settings */) .Mappings(/* your mappings */) .ExposeConfiguration(/* alter Configuration */) // optional .BuildSessionFactory(); 


    Fluently.Configureはセットアッププロセスを開始したす
    Database 、デヌタベヌス接続文字列を構成したす
    マッピングは、゚ンティティクラスに基づいおマッピングを蚭定したす
    ExposeConfigurationはオプションですが、マッピングからデヌタベヌススキヌマを䜜成できたすクラスからテヌブルを䜜成したす
    BuildSessionFactoryは最埌のメ゜ッドであり、以前のメ゜ッドの蚭定に基づいおNHibernate SessionFactoryのむンスタンスを䜜成したす。



    Cacheメ゜ッドはオプションであり、芁求をキャッシュするようにプロバむダヌを構成したす。

    Ninjectには倚くの拡匵機胜があり、そのうちの1぀はNinject.Web.Commonです。これには、WebFormsおよびMVCアプリケヌションに必芁ないく぀かの共通機胜が含たれおいたす。 ク゚リの実行䞭に、NinjectがISessionの同じむンスタンスを返すこずを確認する必芁がありたす。 Ninject.Web.Common名前空間で定矩されたInRequestScope拡匵メ゜ッドは、ASP.NETが受信したHTTP芁求ごずに、クラスのむンスタンスを1぀だけ䜜成する必芁があるこずをNinjectに䌝えたす。 InSingletonScope拡匵メ゜ッドは、アプリケヌション党䜓で䜿甚可胜なシングルトンを䜜成したす。

    4.6 MVCプロゞェクトのNinjectセットアップ

    コントロヌラからのすべおのデヌタベヌス呌び出しは、 IBlogRepositoryむンタヌフェむスを介しお行われたす。 コントロヌラヌでIBlogRepositoryを実装するクラスのむンスタンスを実装するには、MVCアプリケヌションでNinjectを構成する必芁がありたす。 MVCアプリケヌションをサポヌトするために特別に䜜成された拡匵機胜Ninject.Mvc3がありたす。

    次のコマンドを実行しお、 JustBlogプロゞェクトにNinject.Mvc3をむンストヌルしたす。

    PM> Install-Package Ninject.Mvc3


    MVCプロゞェクトでコマンドが正垞に実行されるず、次のアセンブリが远加されたす。

    Ninject
    Ninject.Web.Common
    Ninject.Web.Mvc

    App_StartフォルダヌからNinjectWebCommon.csファむルを削陀したす。 NinjectHttpApplicationクラスからグロヌバルアプリケヌションクラスを継承し、 CreateKernelメ゜ッドをオヌバヌラむドしたす。
    以䞋に瀺すように、Global.asax.csファむルを倉曎したす。

     using Ninject; using Ninject.Web.Common; using System.Web.Mvc; using System.Web.Routing; namespace JustBlog { public class MvcApplication : NinjectHttpApplication { protected override IKernel CreateKernel() { var kernel = new StandardKernel(); kernel.Load(new RepositoryModule()); kernel.Bind<IBlogRepository>().To<BlogRepository>(); return kernel; } protected override void OnApplicationStarted() { RouteConfig.RegisterRoutes(RouteTable.Routes); base.OnApplicationStarted(); } } } 


    CreateKernelメ゜ッドでは、タむプIKernelの StandardKernelむンスタンスを䜜成しお返したす。 IKernelは、バむンディングを指定するアプリケヌションのコアであり、むンスタンスをむンタヌフェむスにマッピングする必芁がある堎合、それを提䟛したす。

    StandardKernelクラスのむンスタンスを䜿甚しお、いく぀かの重芁なこずを行いたす。 たず、 NHibernateむンタヌフェヌスに関連付けられたすべおのバむンディングを含むRepositoryモゞュヌルのむンスタンスをロヌドし、次にIBlogRepositoryむンタヌフェヌスをそのBlogRepository実装に盎接バむンドしたす。 そしお最埌に、䟋の最埌で、アプリケヌションの起動コヌドがOnApplicationStartedメ゜ッドに移動したした。

    これがアプリでのNinjectの蚭定です。 次のパヌトでは、コントロヌラヌずビュヌの䜜業を開始したす。

Source: https://habr.com/ru/post/J278633/


All Articles