åºæ¬çãªã€ã³ãã©ã¹ãã©ã¯ãã£ã®äœæã
ãã®éšåã§ã¯ãå®è£
ããå¿
èŠãããã¿ã¹ã¯ã«ã€ããŠèª¬æããŸãã
ã¿ã¹ã¯1ïŒæè¿ã®ããã°æçš¿ã衚瀺ãã
ã¿ã¹ã¯2ïŒç¹å®ã®ã«ããŽãªã®æçš¿ã衚瀺ãã
ã¿ã¹ã¯3ïŒã¿ã°ããŒã¹ã®æçš¿ã衚瀺ãã
ã¿ã¹ã¯4ïŒæçš¿ã®æ€çŽ¢
ã¿ã¹ã¯5.æçš¿å
šäœã衚瀺ããã«ã¯
ã¿ã¹ã¯6.ç¹å®ã®ã«ããŽãªã®æçš¿ããŠã£ãžã§ããã«è¡šç€ºãã
ã¿ã¹ã¯7ïŒãŠã£ãžã§ããã®ã¿ã°ã«åºã¥ããŠæçš¿ã衚瀺ãã
ã¿ã¹ã¯8.ãŠã£ãžã§ããã«æåŸã®æçš¿ã衚瀺ãã
ã¿ã¹ã¯1.ææ°ã®ããã°æçš¿ã衚瀺ããŸãã
ãã®ã¿ã¹ã¯ãå®è¡ããã«ã¯ãããŒã¿ããŒã¹ããããã°æçš¿ãéžæããŠãã¥ãŒã«è¡šç€ºããå¿
èŠããããŸãã
ãã®ã¿ã¹ã¯ã¯ååã«å€§ããã®ã§ããããããã€ãã®å°ããªãµãã¿ã¹ã¯ã«åå²ããŸãã
- åºæ¬çãªãœãªã¥ãŒã·ã§ã³ãäœæãã
- ãã¡ã€ã³ã¯ã©ã¹ãäœæãã
- Fluent NHibernateããã³NHibernateãæ§æãã
- ãããã³ã°ã¯ã©ã¹ãããŒã¿ã¢ã¯ã»ã¹ã¯ã©ã¹ãããã³ã¡ãœãããäœæãã
- JustBlog.Coreã®Ninjectãæ§æãã
- MVCãããžã§ã¯ãã®Ninjectãæ§æãã
- ã³ã³ãããŒã©ãŒãšã¢ã¯ã·ã§ã³ãäœæãã
- ãã¥ãŒãäœæ
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 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() .Mappings() .ExposeConfiguration()
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ã®èšå®ã§ãã 次ã®ããŒãã§ã¯ãã³ã³ãããŒã©ãŒãšãã¥ãŒã®äœæ¥ãéå§ããŸãã