·ÖÏíweb¿ª·¢ÖªÊ¶

×¢²á/µÇ¼|×î½ü·¢²¼|½ñÈÕÍÆ¼ö

Ö÷Ò³ ITÖªÊ¶ÍøÒ³¼¼ÊõÈí¼þ¿ª·¢Ç°¶Ë¿ª·¢´úÂë±à³ÌÔËӪά»¤¼¼Êõ·ÖÏí½Ì³Ì°¸Àý
µ±Ç°Î»ÖãºÊ×Ò³ > ÍøÒ³¼¼Êõ

[ASP.NET MVC Сţ֮·]05 - ʹÓà NinjectʵÏÖÒÀÀµ×¢Èë

·¢²¼Ê±¼ä£º2023-09-06 01:13ÔðÈα༭£ºÅíС·¼¹Ø¼ü´Ê£º.NETMVC

ÔÚ[ASP.NET MVC Сţ֮·]ϵÁÐÉÏһƪÎÄÕ£¨ÒÀÀµ×¢Èë(DI)ºÍNinject£©µÄĩβÌáµ½ÁËÔÚASP.NET MVCÖÐʹÓÃNinjectÒª×öµÄÁ½¼þÊÂÇé£¬ÐøÕâÆªÎÄÕÂÖ®ºó£¬±¾ÎĽ«ÓÃÒ»¸öʵ¼ÊµÄʾÀýÀ´ÑÝʾNinjectÔÚASP.NET MVCÖеÄÓ¦Óá£

ΪÁ˸üºÃµÄÀí½âºÍ³ÅÎÕ±¾ÎÄÄÚÈÝ£¬Ç¿ÁÒ½¨Òé³õѧÕßÔĶÁ±¾ÎÄǰÏÈÔĶÁÒÀÀµ×¢Èë(DI)ºÍNinject¡£

±¾ÎÄĿ¼£º

×¼±¸¹¤×÷

н¨Ò»¸öÃûΪBookShopµÄ¿Õ°×½â¾ö·½°¸¡£Ôڸýâ¾ö·½°¸ÖзֱðÌí¼ÓÒ»¸öÃûΪBookShop.WebUIµÄMVC¿ÕÓ¦ÓóÌÐò£¬ºÍÒ»¸öÃûΪBookShop.DomainµÄÀà¿â¹¤³Ì¡£Ä¿Â¼½á¹¹ÈçÏ£º

Á½¸ö¹¤³ÌÌí¼ÓÍêºó£¬ÔÚBookShop.WebUI¹¤³ÌÏÂÌí¼ÓBookShop.Domain¹¤³ÌµÄÒýÓá£

ʹÓÃNuGet·Ö±ðΪBookShop.WebUI¹¤³ÌºÍBookShop.Domain¹¤³Ì°²×°Ninject°ü£¨NuGetµÄ½éÉÜÇëÔĶÁÒÀÀµ×¢Èë(DI)ºÍNinject£©¡£¿ÉÒÔͨ¹ý¿ÉÊÓ»¯´°¿Ú°²×°£¬Ò²¿ÉÒÔ´ò¿ªPackage Manager Console£¨ÊÓͼ->ÆäËû´°¿Ú->Package Manager Console£©Ö´ÐÐÏÂÃæÃüÁî°²×°£º
Install-Package Ninject -Project BookShop.WebUI 
Install-Package Ninject -Project BookShop.Domain
ÏÂͼ˵Ã÷°²×°³É¹¦£º

´´½¨Controller Factory

ÎÒÃÇÖªµÀ£¬ÔÚASP.NET MVCÖУ¬Ò»¸ö¿Í»§¶ËÇëÇóÊÇÔÚÌØ¶¨ControllerµÄActionÖнøÐд¦ÀíµÄ¡£ ĬÈÏÇé¿öÏ£¬ASP.NET MVCʹÓÃÄÚÖõÄController¹¤³§Àà DefaultControllerFactoryÀ´´´½¨Ä³¸öÇëÇó¶ÔÓ¦µÄControllerʵÀý¡£ÓÐʱºòĬÈϵÄController¹¤³§²»ÄÜÂú×ãÎÒÃÇʵ¼ÊµÄÐèÇó£¬ÎÒÃǾÍÐèÒª¶ÔÕâÖÖĬÈÏÐÐΪ½øÐÐÀ©Õ¹£¬¼´´´½¨Ò»¸ö¼Ì³Ð×ÔDefaultControllerFactoryÀàµÄ×Ô¶¨ÒåController¹¤³§Àà²¢ÖØÐ´ÆäÖеÄһЩ·½·¨¡£Îª´Ë£¬ÎÒÃÇÔÚBookShop.WebUI¹¤³ÌÏ´´½¨Ò»¸öÃûΪInfrastructureµÄÎļþ¼Ð£¬ÔÚ¸ÃÎļþ¼ÐÖÐÌí¼ÓÒ»¸öÃûΪNinjectControllerFactoryµÄ¹¤³§À࣬´úÂëÈçÏ£º

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:ºóÃæÔÙÀ´Ìí¼Ó°ó¶¨ ???}}

ÉÏÃæ´úÂëÖеĠninjectKernel.Get(controllerType) ¿É»ñÈ¡µ½Ò»¸öControllerʵÀý¡£ÔÚÕâÀïÈç¹ûÊÖ¶¯ÊµÀý»¯ControllerÀàÊÇÒ»¸ö·Ç³£¸´ÔӵĹý³Ì£¬ÎÒÃDz»ÖªµÀControllerÀàÓÐûÓдø²ÎÊýµÄ¹¹Ô캯Êý£¬Ò²²»ÖªµÀ¹¹Ô캯ÊýµÄ²ÎÊýÊÇʲôÀàÐÍ¡£¶øÊ¹ÓÃNinjectÖ»ÐèҪʹÓÃÉÏÃæµÄÒ»¸öGet·½·¨¾Í¿ÉÒÔ£¬NinjectÄÚ²¿»á×Ô¶¯´¦ÀíËùÓеÄÒÀÀµ¹ØÏµ£¬ÖÇÄܵش´½¨ÎÒÃÇÐèÒªµÄ¶ÔÏó¡£

Controller¹¤³§Àà´´½¨ºÃºó£¬ÎÒÃǾÍÐèÒª¸æËßMVCÓÃÎÒÃǵÄNinjectControllerFactoryÀàÀ´´´½¨Controller¶ÔÏó£¬Îª´Ë£¬ÐèÔÚGlobal.asaxÎļþµÄApplication_Start·½·¨ÖÐÌí¼ÓÏÂÃæ´úÂ룺

protected void Application_Start() { ???...... ???//ÉèÖÃController¹¤³§ ???ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());}

ÕâÀïÎÒÃÇÔÝÇÒ²»È¥¹ØÐÄÉÏÃæÕâ¶Î´úÂëÊÇʲôԭÀí£¬ÖªµÀÉèÖÃ×Ô¶¨ÒåµÄController¹¤³§±ØÐëÒªÔÚÕâ×¢²á¾ÍÐÐÁË£¬ÓпյϰÎÒ»áÔÚºóÐø²©ÎĶÔÕⲿ·ÖÄÚÈݽøÐиüÉîÈëµÄ½²½â¡£

Ìí¼ÓDomain Model

ÔÚMVCÓ¦ÓóÌÐòÖУ¬Ò»Çж¼ÊÇÎ§ÈÆDomain Model£¨ÁìÓòÄ£ÐÍ£©À´µÄ¡£ ËùÒÔÎÒÃÇÔÚBookShop.Domain¹¤³ÌÖÐרÃŽ¨Ò»¸öÃûΪEntitiesµÄÎļþ¼Ð£¬ÓÃÀ´´æ·ÅÁìÓòʵÌåÄ£ÐÍ¡£×÷Ϊһ¸öµç×ÓÉÌÎñÀàµÄÍøÉÏÊéµê£¬µ±È»×îÖØÒªµÄÒ»¸öÁìÓòʵÌå¾ÍÊÇBookÁË¡£ÓÉÓÚÖ»ÊÇΪÁËÑÝʾ£¬ÎÒÃǼòµ¥¶¨ÒåÒ»¸öBookÀ࣬²¢ÔÚEntitiesÎļþ¼ÐÖÐÌí¼Ó¸ÃÀ࣬´úÂëÈçÏ£º

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

Ìí¼ÓRepository

ÎÒÃÇÖªµÀ£¬ÎÒÃǿ϶¨ÐèÒªÒ»ÖÖ·½Ê½À´´ÓÊý¾Ý¿âÖжÁÈ¡BookÊý¾Ý¡£ÔÚÕâÎÒÃDz»·ÀΪÊý¾ÝµÄʹÓÃÕߣ¨ÕâÀïÖ¸Controller£©Ìṩһ¸öIBookRepository½Ó¿Ú£¬ÔÚÕâ¸ö½Ó¿ÚÖÐÉùÃ÷Ò»¸öIQueryable<Book>ÀàÐ͵ÄÊôÐÔBooks¡£ÕâÑù£¬Í¨¹ý¸Ã½Ó¿ÚʹÓÃÒÀÀµ×¢È룬ʹÓÃÕ߾ͿÉÒÔÄõ½BooksÊý¾Ý¼¯ºÏ£¬¶ø²»ÓùØÐÄÊý¾ÝÊÇÈçºÎµÃµ½µÄ¡£Îª´Ë£¬ÎÒÃÇÔÚBookShop.Domain¹¤³ÌÖÐÌí¼ÓÒ»¸öÃûΪ AbstractµÄÎļþ¼Ð£¬ÔÚ¸ÃÎļþ¼ÐÖÐÌí¼ÓÎÒÃǵÄIBookRepository½Ó¿ÚÎļþ£¬´úÂëÈçÏ£º

public interface IBookRepository { ???IQueryable<Book> Books { get; }}

ÔÚ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; ???}}

ΪÁËÑÝʾ£¬ÉÏÃæÊÇÊÖ¹¤ÔìµÄһЩÊý¾Ý£¬ºóÃæµÄÎÄÕÂÎÒ½«½éÉÜʹÓÃEntity Framwork´ÓÊý¾Ý¿âÖжÁÈ¡Êý¾Ý¡£¶ÔÓÚ¸Õ½Ó´¥ORM¿ò¼ÜµÄÅóÓÑ¿ÉÄܶÔÕâÀïIQueryable¸Ðµ½Ææ¹Ö£¬ÎªÊ²Ã´ÓÃIQueryable×÷Ϊ·µ»ØÀàÐÍ£¬¶ø²»ÓÃIEnumerableÄØ£¿ºóÃæÓлú»á½²Entity FramworkµÄʱºòÔÙ½²¡£

Ìí¼Ó°ó¶¨

´ò¿ªÖ®Ç°ÎÒÃÇÔÚBookShop.WebUI¹¤³Ì´´½¨µÄNinjectControllerFactoryÀ࣬ÔÚAddBindings·½·¨ÖÐÌí¼ÓÈçÏ´úÂ룺

private void AddBindings() { ???ninjectKernel.Bind<IBookRepository>().To<BookRepository>();}

Õâ¾ä´úÂ룬ͨ¹ý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; ???}}

ÔÚÕ⣬BookControllerµÄ¹¹Ô캯Êý½ÓÊÜÁËÒ»¸öIBookRepository²ÎÊý£¬µ±BookController±»ÊµÀý»¯µÄʱºò£¬Ninject¾ÍΪÆä×¢ÈëÁËBookRepositoryµÄÒÀÀµ¡£½ÓÏÂÀ´ÎÒÃÇΪÕâ¸öControllerÌí¼ÓÒ»¸öÃûΪListµÄAction£¬ÓÃÀ´³ÊÏÖBookÁÐ±í¡£´úÂëÈçÏ£º

public class BookController : Controller { ???... ???public ViewResult List() { ???????return View(repository.Books); ???}}

µ±È»ÎÒÃÇÐèÒªÌí¼ÓÒ»¸öView¡£ÓÒ»÷ÉÏÃæµÄList·½·¨£¬Ñ¡ÔñÌí¼ÓÊÓͼ£¬ÔÚµ¯³öµÄ´°¿Ú½øÐÐÈçÏÂÅäÖãº

È»ºóÎÒÃÇÔÚ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> ????}

×îºóÎÒÃÇ»¹ÐèÒªÐÞ¸ÄÒ»ÏÂĬÈÏ·ÓÉ£¬ÈÃϵͳÔËÐкóÖ±½Óµ¼Ïòµ½ÎÒÃǵÄ{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 } ???);}

µ½Õ⣬ÎÒÃǵijÌÐò¿ÉÒÔÔËÐÐÁË£¬Ð§¹ûÈçÏ£º

½áÊøÓ

±¾ÎÄÊÇNinjectÔÚASP.NET MVCÖÐʹÓõÄÒ»¸ö¼òµ¥Ê¾Àý£¬Ä¿µÄÊÇÈôó¼ÒÁ˽âNinjectÔÚMVCÖеÄʹÓ÷½·¨¡£µ±È»£¬NinjectµÄÇ¿´óÖ®´¦²»½öÏÞÓÚ±¾ÎÄËùÑÝʾµÄ£¬ÏàÐŵ±ÄãÊìϤÁËNijectÖ®ºó£¬ÔڴMVCÓ¦ÓóÌÐòʱ£¬ÄãÒ»¶¨»áϲ»¶ÉÏËüµÄ¡£

ÆÀÂÛ¾«Ñ¡

#8Â¥[Â¥Ö÷] 2013-11-02 08:23 | Liam Wang 
@heren2013
ÒýÓÃpublic BookController(IBookRepository bookRepository) {repository = bookRepository;
}
ÇëÎÊÔÚÄÄÀïµ÷ÓÃÁËÕâ¸ö¹¹Ô캯Êý,ÇÒ¹¹Ô캯ÊýÖеIJÎÊýÔÚÄÄÀï³õʼ»¯ÄØ,ÄѵÀninjectKernel.Bind<IBookRepository>().To<BookRepository>();Õâ¶Î´úÂë¾ÍÒѾ­³õʼ»¨Á˹¹Ô캯ÊýÀïµÄ²ÎÊýÁËÂð?Çó½â

BookControllerÀàµÄ´´½¨£¨º¬³õʼ»¯£©Ö÷Òª¾­¹ýÏÂÃæÕâÈý¸ö¹ý³Ì£º
1.ÔÚApplication_StartÖУ¬ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());Õâ¶Î×¢²á´úÂë¸æËßMVCÓÃNinjectControllerFactory¹¤³§ÀàÀ´´´½¨ËùÓÐController¶ÔÏó¡£
ÔÚNinjectControllerFactoryÀàÖаüº¬ÁËÏÂÃæÁ½¸ö¹ý³Ì£º°ó¶¨½Ó¿Úµ½½Ó¿ÚµÄʵÏֺʹ´½¨ControllerÀà¶ÔÏó¡£
2.ninjectKernel.Bind<IBookRepository>().To<BookRepository>();Õâ¶Î°ó¶¨´úÂë¸æËßninjectKernelµ±±»ÇëÇóÒ»¸öIBookRepository½Ó¿ÚµÄʵÏÖʱÔò·µ»ØÒ»¸öBookRepository¶ÔÏó¡£
3.ÇëÄãÔĶÁNinjectControllerFactoryÀàÖеÄGetControllerInstance·½·¨£¬Í¨¹ýninjectKernel.Get(controllerType)Õâ¾ä´úÂ룬ninject»ñÈ¡controller£¨ÈçBookController£©¶ÔÏóµÄÐÅÏ¢²¢´´½¨¸ÃcontrollerµÄʵÀý£¬Õâ¸ö¹ý³Ì»áµ÷ÓÃcontrollerµÄ¹¹Ô캯Êý£¬Ëü»á×Ô¶¯ÅжϹ¹Ô캯ÊýËùÐèÒªµÄ²ÎÊý£¬ÈçBookControllerÀàµÄ¹¹Ô캯ÊýÐèÒªÒ»¸öIBookRepository½Ó¿Ú²ÎÊý£¬¸ù¾ÝµÚ2¸ö¹ý³Ìninject×¢²áµÄ°ó¶¨£¬ninject»á¸ø¸Ã¹¹Ô캯Êý´«µÝBookRepository¶ÔÏó(IBookRepository½Ó¿ÚµÄʵÏÖÕß)µÄÒýÓá£

#19Â¥ 2013-11-28 09:57 | ±ËÄê¶¹Þ¢
@Liam Wang
²»ÐèÒª°¡£¬Ö»ÐèÒªÔÚApplication_Start()º¯ÊýÖÐ×¢²áһϣº
DependencyResolver.SetResolver(new Code.NinjectDependencyResolver());//×¢²áIocÈÝÆ÷
È»ºóÔÚ¾ßÌåʹÓÃÖУ¬Controller¹¹Ôì×¢Èë»òÕßʹÓÃÊôÐÔ×¢Èë¼´¿É
Ïà¹Ø´úÂ룺
namespace LvJl.WebMvc.Code{ ???public class NinjectDependencyResolver:System.Web.Mvc.IDependencyResolver ???{ ???????private readonly IKernel _kernel; ???????public NinjectDependencyResolver() ???????{ ???????????_kernel=new StandardKernel(); ???????????AddBindings(); ???????} ???????private void AddBindings() ???????{ ???????????_kernel.Bind<IUserService>().To<UserService>(); ???????????_kernel.Bind<IRoleService>().To<RoleService>(); ???????} ???????public object GetService(Type serviceType) ???????{ ???????????return _kernel.TryGet(serviceType); ???????} ???????public IEnumerable<object> GetServices(Type serviceType) ???????{ ???????????return _kernel.GetAll(serviceType); ???????} ???}}protected void Application_Start(){ ???DependencyResolver.SetResolver(new Code.NinjectDependencyResolver());//×¢²áIocÈÝÆ÷ ???AreaRegistration.RegisterAllAreas(); ???WebApiConfig.Register(GlobalConfiguration.Configuration); ???FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); ???RouteConfig.RegisterRoutes(RouteTable.Routes); ???BundleConfig.RegisterBundles(BundleTable.Bundles);}public class UserController : Controller{ ???private readonly IUserService _user; ???public UserController(IUserService userService) ???{ ???????_user = userService; ???} ???public ActionResult Index() ???{ ???????return View(); ???} ???public ActionResult GetAllUsers() ???{ ???????var pageIndex = Request["page"] == null ? 1 : int.Parse(Request["page"]); ???????var pageSize = Request["rows"] == null ? 1 : int.Parse(Request["rows"]); ???????int total; ???????var data = _user.Query(pageIndex, pageSize, out total, u => true, true, u => u.Id); ???????var result = new {total, rows = data}; ???????return Json(result, JsonRequestBehavior.AllowGet); ???}}

[ASP.NET MVC Сţ֮·]05 - ʹÓà NinjectʵÏÖÒÀÀµ×¢Èë

Ô­ÎĵØÖ·£ºhttp://www.cnblogs.com/sjqq/p/7581509.html

ÖªÊ¶ÍÆ¼ö

Îҵıà³ÌÑ§Ï°Íø¡ª¡ª·ÖÏíwebǰ¶Ëºó¶Ë¿ª·¢¼¼Êõ֪ʶ¡£ À¬»øÐÅÏ¢´¦ÀíÓÊÏä tousu563@163.com ÍøÕ¾µØÍ¼
icp±¸°¸ºÅ ÃöICP±¸2023006418ºÅ-8 ²»Á¼ÐÅÏ¢¾Ù±¨Æ½Ì¨ »¥ÁªÍø°²È«¹ÜÀí±¸°¸ Copyright 2023 www.wodecom.cn All Rights Reserved