×î½ü¼¸ÌìÔÚ¿´Ò»±¾ÃûΪDependency
Injection in .NET µÄÊ飬Ö÷Òª½²ÁËʲôÊÇÒÀÀµ×¢È룬ʹÓÃÒÀÀµ×¢ÈëµÄÓŵ㣬ÒÔ¼°.NETƽ̨ÉÏÒÀÀµ×¢ÈëµÄ¸÷ÖÖ¿ò¼ÜºÍÓ÷¨¡£ÔÚÕâ±¾ÊéµÄ¿ªÍ·£¬½²ÊöÁËÈí¼þ¹¤³ÌÖеÄÒ»¸öÖØÒªµÄÀíÄî¾ÍÊǹØ×¢·ÖÀë(Separation
of concern, SoC)¡£ÒÀÀµ×¢Èë²»ÊÇÄ¿µÄ£¬ËüÊÇһϵÁй¤¾ßºÍÊֶΣ¬×îÖÕµÄÄ¿µÄÊǰïÖúÎÒÃÇ¿ª·¢³öËÉÉ¢ñîºÏ(loose
coupled)¡¢¿Éά»¤¡¢¿É²âÊԵĴúÂëºÍ³ÌÐò¡£ÕâÌõÔÔòµÄ×ö·¨ÊÇ´ó¼ÒÊìÖªµÄÃæÏò½Ó¿Ú£¬»òÕß˵ÊÇÃæÏò³éÏó±à³Ì¡£
¹ØÓÚʲôÊÇÒÀÀµ×¢È룬ÔÚStack OverflowÉÏÃæÓÐÒ»¸öÎÊÌ⣬ÈçºÎÏòÒ»¸ö5ËêµÄСº¢½âÊÍÒÀÀµ×¢È룬ÆäÖе÷Ö×î¸ßµÄÒ»¸ö´ð°¸ÊÇ£º
¡°When you go and get things out of the refrigerator
for yourself, you can cause problems. You might leave
the door open, you might get something Mommy or Daddy
doesn¡¯t want you to have. You might even be looking
for something we don¡¯t even have or which has expired.
What you should be doing is stating a need, ¡°I need
something to drink with lunch,¡± and then we will make
sure you have something when you sit down to eat.¡±
Ó³Éäµ½ÃæÏò¶ÔÏó³ÌÐò¿ª·¢ÖоÍÊÇ£º¸ß²ãÀà(5ËêСº¢)Ó¦¸ÃÒÀÀµµ×²ã»ù´¡ÉèÊ©(¼Ò³¤)À´Ìṩ±ØÒªµÄ·þÎñ¡£
±àдËÉñîºÏµÄ´úÂë˵ÆðÀ´ºÜ¼òµ¥£¬µ«ÊÇʵ¼ÊÉÏд×Åдמͱä³ÉÁ˽ôñîºÏ¡£
ʹÓÃÀý×ÓÀ´ËµÃ÷¿ÉÄܸü¼ò½àÃ÷ÁË£¬Ê×ÏÈÀ´¿´¿´Ê²Ã´ÑùµÄ´úÂëÊǽôñîºÏ¡£
1 ²»ºÃµÄʵÏÖ
±àдËÉñîºÏ´úÂëµÄµÚÒ»²½£¬¿ÉÄÜ´ó¼Ò¶¼ÊìϤ£¬ÄǾÍÊǶÔϵͳ·Ö²ã¡£±ÈÈçÏÂÃæµÄ¾µäµÄÈý²ã¼Ü¹¹¡£

·ÖÍê²ãºÍʵÏÖºÃÊÇÁ½¼þÊÂÇ飬²¢²»ÊÇ˵·ÖºÃ²ãÖ®ºó¾ÍÄܹ»ËÉñîºÏÁË¡£
1.1 ½ôñîºÏµÄ´úÂë
ÓкܶàÖÖ·½Ê½À´Éè¼ÆÒ»¸öÁé»îµÄ£¬¿Éά»¤µÄ¸´ÔÓÓ¦Ó㬵«ÊÇn²ã¼Ü¹¹ÊÇÒ»ÖÖ´ó¼Ò±È½ÏÊìϤµÄ·½Ê½£¬ÕâÀïÃæµÄÌôÕ½ÔÚÓÚÈçºÎÕýÈ·µÄʵÏÖn²ã¼Ü¹¹¡£
¼ÙÉèҪʵÏÖÒ»¸öºÜ¼òµ¥µÄµç×ÓÉÌÎñÍøÕ¾£¬ÒªÁгöÉÌÆ·ÁÐ±í£¬ÈçÏ£º

ÏÂÃæ¾Í¾ßÌåÀ´ÑÝʾͨ³£µÄ×ö·¨£¬ÊÇÈçºÎÒ»²½Ò»²½°Ñ´úÂëд³ö½ôñîºÏµÄ¡£
1.1.1 Êý¾Ý·ÃÎʲã
ҪʵÏÖÉÌÆ·ÁбíÕâÒ»¹¦ÄÜ£¬Ê×ÏÈÒª±àдÊý¾Ý·ÃÎʲ㣬ÐèÒªÉè¼ÆÊý¾Ý¿â¼°±í£¬ÔÚSQLServerÖÐÉè¼ÆµÄÊý¾Ý¿â±íProduct½á¹¹ÈçÏ£º

±íÉè¼ÆºÃÖ®ºó£¬¾Í¿ÉÒÔ¿ªÊ¼Ð´´úÂëÁË¡£ÔÚVisual Studio ÖУ¬Ð½¨Ò»¸öÃûΪDataAccessLayerµÄ¹¤³Ì£¬Ìí¼ÓÒ»¸öADO.NET
Entity Data Model£¬´ËʱVisual StudioµÄÏòµ¼»á×Ô¶¯°ïÎÒÃÇÉú³ÉProductʵÌåºÍObjectContext
DB²Ù×÷ÉÏÏÂÎÄ¡£ÕâÑùÎÒÃÇµÄ Data Access Layer¾ÍдºÃÁË¡£

1.1.2 ÒµÎñÂß¼²ã
±íÏÖ²ãʵ¼ÊÉÏ¿ÉÒÔÖ±½Ó·ÃÎÊÊý¾Ý·ÃÎʲ㣬ͨ¹ýObjectContext »ñÈ¡Product ÁÐ±í¡£µ«ÊÇ´ó¶àÊýÇé¿öÏ£¬ÎÒÃDz»ÊÇÖ±½Ó°ÑDBÀïÃæµÄÊý¾ÝÕ¹ÏÖ³öÀ´£¬¶øÊÇÐèÒª¶ÔÊý¾Ý½øÐд¦Àí£¬±ÈÈç¶Ô»áÔ±£¬ÐèÒª¶ÔijЩÉÌÆ·µÄ¼Û¸ñ´òÕÛ¡£ÕâÑùÎÒÃǾÍÐèÒªÒµÎñÂß¼²ã£¬À´´¦ÀíÕâЩÓë¾ßÌåÒµÎñÂß¼Ïà¹ØµÄÊÂÇé¡£
н¨Ò»¸öÀà¿â£¬ÃüÃûΪDomainLogic£¬È»ºóÌí¼ÓÒ»¸öÃûΪProductServiceµÄÀࣺ
public class ProductService { private readonly CommerceObjectContext objectContext;
public ProductService()
{
this.objectContext = new CommerceObjectContext();
}
public IEnumerable<Product> GetFeaturedProducts(
bool isCustomerPreferred)
{
var discount = isCustomerPreferred ? .95m : 1;
var products = (from p in this.objectContext
.Products
where p.IsFeatured
select p).AsEnumerable();
return from p in products
select new Product
{
ProductId = p.ProductId,
Name = p.Name,
Description = p.Description,
IsFeatured = p.IsFeatured,
UnitPrice = p.UnitPrice * discount
};
}
} |
ÏÖÔÚÎÒÃǵÄÒµÎñÂß¼²ãÒѾʵÏÖÁË¡£
1.1.3 ±íÏÖ²ã
ÏÖÔÚʵÏÖ±íÏÖ²ãÂß¼£¬ÕâÀïʹÓÃASP.NET MVC£¬ÔÚIndex Ò³ÃæµÄControllerÖУ¬»ñÈ¡ÉÌÆ·ÁбíÈ»ºó½«Êý¾Ý·µ»Ø¸øView¡£
public ViewResult Index() { bool isPreferredCustomer = this.User.IsInRole("PreferredCustomer");
var service = new ProductService();
var products =
service.GetFeaturedProducts(isPreferredCustomer);
this.ViewData["Products"] = products;
return this.View();
} |
È»ºóÔÚViewÖн«ControllerÖзµ»ØµÄÊý¾ÝÕ¹ÏÖ³öÀ´£º
<h2>Featured Products</h2> <div> <% var products = (IEnumerable<Product>)this.ViewData["Products"]; foreach (var product in products) { %> <div> <%= this.Html.Encode(product.Name) %> (<%= this.Html.Encode(product.UnitPrice.ToString("C")) %>) </div> <% } %> </div>
|
1.2 ·ÖÎö
ÏÖÔÚ£¬°´ÕÕÈý²ã¡°¼Ü¹¹¡±ÎÒÃǵĴúÂëдºÃÁË£¬²¢ÇÒÒ²´ïµ½ÁËÒªÇó¡£Õû¸öÏîÄ¿µÄ½á¹¹ÈçÏÂͼ£º

ÕâÓ¦¸ÃÊÇÎÒÃÇͨ³£¾³£Ð´µÄËùνµÄÈý²ã¼Ü¹¹¡£ÔÚVisual StudioÖУ¬Èý²ãÖ®¼äµÄÒÀÀµ¿ÉÒÔͨ¹ýÏîÄ¿ÒýÓñíÏÖ³öÀ´¡£
1.2.1 ÒÀÀµ¹ØÏµÍ¼
ÏÖÔÚÎÒÃÇÀ´·ÖÎöһϣ¬ÕâÈý²ãÖ®¼äµÄÒÀÀµ¹ØÏµ£¬ºÜÃ÷ÏÔ£¬ÉÏÃæµÄʵÏÖÖУ¬DomianLogicÐèÒªÒÀÀµSqlDataAccess£¬ÒòΪDomainLogicÖÐÓõ½ÁËProductÕâһʵÌ壬¶øÕâ¸öʵÌåÊǶ¨ÒåÔÚDataAccessÕâÒ»²ãµÄ¡£WebUIÕâÒ»²ãÐèÒªÒÀÀµDomainLogic£¬ÒòΪProductServiceÔÚÕâÒ»²ã£¬Í¬Ê±£¬»¹ÐèÒªÒÀÀµDataAccess£¬ÒòΪÔÚUIÖÐÒ²Óõ½ÁËProductʵÌ壬ÏÖÔÚÕû¸öϵͳµÄÒÀÀµ¹ØÏµÊÇÕâÑùµÄ£º

1.2.2 ñîºÏÐÔ·ÖÎö
ʹÓÃÈý²ã½á¹¹µÄÖ÷ҪĿµÄÊÇ·ÖÀë¹Ø×¢µã£¬µ±È»»¹ÓÐÒ»¸öÔÒòÊǿɲâÊÔÐÔ¡£ÎÒÃÇÓ¦¸Ã½«ÁìÓòÄ£ÐÍ´ÓÊý¾Ý·ÃÎʲãºÍ±íÏÖ²ãÖзÖÀë³öÀ´£¬ÕâÑùÕâÁ½¸ö²ãµÄ±ä»¯²Å²»»áÎÛȾÁìÓòÄ£ÐÍ¡£ÔÚ´óµÄϵͳÖУ¬ÕâµãºÜÖØÒª£¬ÕâÑù²ÅÄܽ«ÏµÍ³ÖеIJ»Í¬²¿·Ö¸ôÀ뿪À´¡£
ÏÖÔÚÀ´¿´Ö®Ç°µÄʵÏÖÖУ¬ÓÐûÓÐÄ£¿éÐÔ£¬ÓÐûÓÐÄǸöÄ£¿é¿ÉÒÔ¸ôÀë³öÀ´ÄØ¡£ÏÖÔÚÌí¼Ó¼¸¸öеÄcaseÀ´¿´£¬ÏµÍ³ÊÇ·ñÄܹ»ÏìÓ¦ÕâЩÐèÇó£º
Ìí¼ÓеÄÓû§½çÃæ
³ýÁËWebFormÓû§Ö®Í⣬¿ÉÄÜ»¹ÐèÒªÒ»¸öWinFormµÄ½çÃæ£¬ÏÖÔÚÎÒÃÇÄÜ·ñ¸´ÓÃÁìÓò²ãºÍÊý¾Ý·ÃÎʲãÄØ£¿´ÓÒÀÀµÍ¼ÖпÉÒÔ¿´µ½£¬Ã»ÓÐÈκÎÒ»¸öÄ£¿é»áÒÀÀµ±íÏֲ㣬Òò´ËºÜÈÝÒ×ʵÏÖÕâÒ»µã±ä»¯¡£ÎÒÃÇÖ»ÐèÒª´´½¨Ò»¸öWPFµÄ¸»¿Í»§¶Ë¾Í¿ÉÒÔ¡£ÏÖÔÚÕû¸öϵͳµÄÒÀÀµÍ¼ÈçÏ£º

¸ü»»ÐµÄÊý¾ÝÔ´
¿ÉÄܹýÁËÒ»¶Îʱ¼ä£¬ÐèÒª°ÑÕû¸öϵͳ²¿Êðµ½ÔÆÉÏ£¬ÒªÊ¹ÓÃÆäËûµÄÊý¾Ý´æ´¢¼¼Êõ£¬±ÈÈçAzure Table Storage
Service¡£ÏÖÔÚ£¬Õû¸ö·ÃÎÊÊý¾ÝµÄÐÒé·¢ÉúÁ˱仯£¬·ÃÎÊAzure Table Storage ServiceµÄ·½Ê½ÊÇHttpÐÒ飬¶øÖ®Ç°µÄ´ó¶àÊý.NET
·ÃÎÊÊý¾ÝµÄ·½Ê½¶¼ÊÇ»ùÓÚADO.NET µÄ·½Ê½¡£²¢ÇÒÊý¾ÝÔ´µÄ±£´æ·½Ê½Ò²·¢ÉúÁ˸ı䣬֮ǰÊǹØÏµÐÍÊý¾Ý¿â£¬ÏÖÔÚ±ä³ÉÁËkey-valueÐÍÊý¾Ý¿â¡£

ÓÉÉÏÃæµÄÒÀÀµ¹ØÏµÍ¼¿ÉÒÔ¿´³ö£¬ËùÓеIJ㶼ÒÀÀµÁËÊý¾Ý·ÃÎʲ㣬Èç¹ûÐÞ¸ÄÊý¾Ý·ÃÎʲ㣬ÔòÁìÓòÂß¼²ã£¬ºÍ±íÏֲ㶼ÐèÒª½øÐÐÏàÓ¦µÄÐ޸ġ£
1.2.3 ÎÊÌâ
³ýÁËÉÏÃæµÄ¸÷²ãÖ®¼äñîºÏϹýǿ֮Í⣬´úÂëÖл¹ÓÐÆäËûÎÊÌâ¡£
ÁìÓòÄ£ÐÍËÆºõ¶¼Ð´µ½ÁËÊý¾Ý·ÃÎʲãÖС£ËùÒÔÁìÓòÄ£ÐÍ¿´ÆðÀ´ÒÀÀµÁËÊý¾Ý·ÃÎʲ㡣ÔÚÊý¾Ý·ÃÎʲãÖж¨ÒåÁËÃûΪProductµÄÀ࣬ÕâÖÖÀàÓ¦¸ÃÊÇÊôÓÚÁìÓòÄ£ÐͲãµÄ¡£
±íÏÖ²ãÖвôÈëÁ˾ö¶¨Ä³¸öÓû§ÊÇ·ñÊÇ»áÔ±µÄÂß¼¡£ÕâÖÖÒµÎñÂß¼Ó¦¸ÃÊÇ ÒµÎñÂß¼²ãÖÐÓ¦¸Ã´¦ÀíµÄ£¬ËùÒÔÒ²Ó¦¸Ã·Åµ½ÁìÓòÄ£ÐͲã
ProductServiceÒòΪÒÀÀµÁËÊý¾Ý·ÃÎʲ㣬ËùÒÔÒ²»áÒÀÀµÔÚweb.config
ÖÐÅäÖõÄÊý¾Ý¿âÁ¬½Ó×Ö·û´®µÈÐÅÏ¢¡£ÕâʹµÃ£¬Õû¸öÒµÎñÂß¼²ãÒ²ÐèÒªÒÀÀµÕâЩÅäÖòÅÄÜÕý³£ÔËÐС£
ÔÚViewÖУ¬°üº¬ÁËÌ«¶àÁ˺¯ÊýÐÔ¹¦ÄÜ¡£ËûÖ´ÐÐÁËÇ¿ÖÆÀàÐÍת»»£¬×Ö·û´®¸ñʽ»¯µÈ²Ù×÷£¬ÕâЩ¹¦ÄÜÓ¦¸ÃÊÇÔÚ½çÃæÏÔʾµÃÄ£ÐÍÖÐÍê³É¡£
ÉÏÃæ¿ÉÄÜÊÇÎÒÃÇ´ó¶àÊýд´úÂëʱºòµÄʵÏÖ£¬ UI½çÃæ²ãÈ¥ÒÀÀµÁËÊý¾Ý·ÃÎʲ㣬ÓÐʱºò͵ÀÁ¾ÍÖ±½ÓÒýÓÃÁËÕâÒ»²ã£¬ÒòΪʵÌ嶨ÒåÔÚÀïÃæÁË¡£ÒµÎñÂß¼²ãÒ²ÊÇÒÀÀµÊý¾Ý·ÃÎʲ㣬ֱ½ÓÔÚÒµÎñÂß¼ÀïÃæÊ¹ÓÃÁËÊý¾Ý·ÃÎʲãÀïÃæµÄʵÌå¡£ÕâÑùʹµÃÕû¸öϵͳ½ôñîºÏ£¬²¢ÇҿɲâÊÔÐԲÄÇÏÖÔÚÎÒÃÇ¿´¿´£¬ÈçºÎÐÞ¸ÄÕâÑùÒ»¸öϵͳ£¬Ê¹Ö®´ïµ½ËÉÉ¢ñîºÏ£¬´Ó¶øÌá¸ß¿É²âÊÔÐÔÄØ£¿
2 ½ÏºÃµÄʵÏÖ
ÒÀÀµ×¢ÈëÄܹ»½ÏºÃµÄ½â¾öÉÏÃæ³öÏÖµÄÎÊÌ⣬ÏÖÔÚ¿ÉÒÔʹÓÃÕâһ˼ÏëÀ´ÖØÐÂʵÏÖÇ°ÃæµÄϵͳ¡£Ö®ËùÒÔÖØÐÂʵÏÖÊÇÒòΪ£¬Ç°ÃæµÄʵÏÖÔÚÒ»¿ªÊ¼µÄËÆºõ¾ÍûÓп¼Âǵ½À©Õ¹ÐÔºÍËÉñîºÏ£¬Ê¹ÓÃÖØ¹¹µÄ·½Ê½ºÜÄÑ´ïµ½ÀíÏëµÄЧ¹û¡£¶ÔÓÚСµÄϵͳÀ´Ëµ¿ÉÄÜ»¹¿ÉÒÔ£¬µ«ÊǶÔÓÚÒ»¸ö´óÐ͵Äϵͳ£¬Ó¦¸ÃÊDZȽÏÀ§Äѵġ£
ÔÚд´úÂëµÄʱºò£¬Òª¹ÜÀíºÃÒÀÀµÐÔ£¬ÔÚÇ°ÃæµÄʵÏÖÕâÖÖ£¬´úÂëÖ±½Ó¿ØÖÆÁËÒÀÀµÐÔ:µ±ProductServiceÐèÒªÒ»¸öObjectContextÀàµÄËÆºõ£¬Ö±½ÓnewÁËÒ»¸ö£¬µ±HomeControllerÐèÒªÒ»¸öProductServiceµÄʱºò£¬Ö±½ÓnewÁËÒ»¸ö£¬ÕâÑù¿´ÆðÀ´ºÜ¿áºÜ·½±ã£¬Êµ¼ÊÉÏʹµÃÕû¸öϵͳ¾ßÓкܴóµÄ¾ÖÏÞÐÔ£¬±äµÃ½ôñîºÏ¡£new
²Ù×÷ʵ¼ÊÉϾÍÒýÈëÁËÒÀÀµ£¬ ¿ØÖÆ·´×ªÕâÖÖ˼Ïë¾ÍÊÇҪʹµÄÎÒÃDZȽϺõĹÜÀíÒÀÀµ¡£
2.1 ËÉñîºÏµÄ´úÂë
2.1.1 ±íÏÖ²ã
Ê×ÏÈ´Ó±íÏÖ²ãÀ´·ÖÎö£¬±íÏÖ²ãÖ÷ÒªÊÇÓÃÀ´¶ÔÊý¾Ý½øÐÐÕ¹ÏÖ£¬²»Ó¦¸Ã°üº¬¹ý¶àµÄÂß¼¡£ÔÚIndexµÄViewÒ³ÃæÖУ¬´úÂëÏ£Íû¿ÉÒÔд³ÉÕâÑù
<h2> Featured Products</h2> <div> <% foreach (var product in this.Model.Products) { %> <div> <%= this.Html.Encode(product.SummaryText) %></div> <% } %> </div> |
¿ÉÒÔ¿´³ö£¬¸ú֮ǰµÄ±íÏÖ²ã´úÂëÏà±È£¬ÒªÕû½àºÜ¶à¡£ºÜÃ÷ÏÔÊDz»ÐèÒª½øÐÐÀàÐÍת»»£¬ÒªÊµÏÖÕâÑùµÄÄ¿µÄ£¬Ö»ÐèÒªÈÃIndex.aspxÕâ¸öÊÓͼ¼Ì³Ð×Ô
System.Web.Mvc.ViewPage<FeaturedProductsViewModel>
¼´¿É£¬µ±ÎÒÃÇÔÚ´ÓController´´½¨ViewµÄʱºò£¬¿ÉÒÔ½øÐÐÑ¡Ôñ£¬È»ºó»á×Ô¶¯Éú³É¡£Õû¸öÓÃÓÚչʾµÄÐÅÏ¢·ÅÔÚÁËSummaryText×Ö¶ÎÖС£
ÕâÀï¾ÍÒýÈëÁËÒ»¸öÊÓͼģÐÍ(View-Specific Models)£¬Ëû·â×°ÁËÊÓͼµÄÐÐΪ£¬ÕâЩģÐÍÖ»ÊǼòµ¥µÄPOCOs¶ÔÏó(Plain
Old CLR Objects)¡£FeatureProductsViewModelÖаüº¬ÁËÒ»¸öListÁÐ±í£¬Ã¿¸öÔªËØÊÇÒ»¸öProductViewModelÀ࣬ÆäÖж¨ÒåÁËһЩ¼òµ¥µÄÓÃÓÚÊý¾ÝչʾµÄ×ֶΡ£

ÏÖÔÚÔÚControllerÖУ¬ÎÒÃÇÖ»ÐèÒª¸øView·µ»ØFeatureProductsViewModel¶ÔÏó¼´¿É¡£±ÈÈ磺
public ViewResult Index() { var vm = new FeaturedProductsViewModel(); return View(vm); } |
ÏÖÔÚ·µ»ØµÄÊÇ¿ÕÁÐ±í£¬¾ßÌåµÄÌî³ä·½Ê½ÔÚÁìÓòÄ£ÐÍÖУ¬ÎÒÃǽÓ×Å¿´ÁìÓòÄ£ÐͲ㡣
2.1.2 ÁìÓòÂß¼²ã
н¨Ò»¸öÀà¿â£¬ÕâÀïÃæ°üº¬POCOsºÍһЩ³éÏóÀàÐÍ¡£POCOsÓÃÀ´¶ÔÁìÓò½¨Ä££¬³éÏóÀàÐÍÌṩ³éÏó×÷Ϊµ½´ïÁìÓòÄ£Ð͵ÄÈë¿Ú¡£ÒÀÀµ×¢ÈëµÄÔÔòÊÇÃæÏò½Ó¿Ú¶ø²»ÊǾßÌåµÄÀà±à³Ì£¬Ê¹µÃÎÒÃÇ¿ÉÒÔÌæ»»¾ßÌåʵÏÖ¡£
ÏÖÔÚÎÒÃÇÐèҪΪ±íÏÖ²ãÌṩÊý¾Ý¡£Òò´ËÓû§½çÃæ²ãÐèÒªÒýÓÃÁìÓòÄ£ÐͲ㡣¶ÔÊý¾Ý·ÃÎʲãµÄ¼òµ¥³éÏó¿ÉÒÔ²ÉÓÃPatterns
of Enterprise Application ArchitectureÒ»ÊéÖн²µ½µÄRepositoryģʽ¡£Òò´Ë¶¨ÒåÒ»¸öProductRepository³éÏóÀ࣬עÒâÊdzéÏóÀ࣬ÔÚÁìÓòÄ£ÐÍ¿âÖС£Ëü¶¨ÒåÁËÒ»¸ö»ñÈ¡ËùÓÐÌØ¼ÛÉÌÆ·µÄ³éÏó·½·¨£º
public abstract class ProductRepository { public abstract IEnumerable<Product> GetFeaturedProducts(); } |
Õâ¸ö·½·¨µÄProductÀàÖÐÖ»¶¨ÒåÁËÉÌÆ·µÄ»ù±¾ÐÅÏ¢±ÈÈçÃû³ÆºÍµ¥¼Û¡£Õû¸ö¹ØÏµÍ¼ÈçÏ£º

ÏÖÔÚÀ´¿´±íÏֲ㣬HomeControllerÖеÄIndex·½·¨Ó¦¸ÃҪʹÓÃProductServiceʵÀýÀàÀ´»ñÈ¡ÉÌÆ·ÁÐ±í£¬Ö´Ðм۸ñ´òÕÛ£¬²¢ÇÒ°ÑProductÀàËÆ×ª»¯ÎªProductViewModelʵÀý£¬²¢½«¸ÃʵÀý¼ÓÈëµ½FeaturesProductsViewModelÖС£ÒòΪProductServiceÓÐÒ»¸ö´øÓÐÀàÐÍΪProductReposity³éÏóÀàµÄ¹¹Ô캯Êý£¬ËùÒÔÕâÀï¿ÉÒÔͨ¹ý¹¹Ô캯Êý×¢ÈëʵÏÖÁËProductReposity³éÏóÀàµÄʵÀý¡£ÕâÀïºÍ֮ǰµÄ×î´óÇø±ðÊÇ£¬ÎÒÃÇûÓÐʹÓÃnew¹Ø¼ü×ÖÀ´Á¢¼´newÒ»¸ö¶ÔÏ󣬶øÊÇͨ¹ý¹¹Ô캯ÊýµÄ·½Ê½´«Èë¾ßÌåµÄʵÏÖ¡£
ÏÖÔÚÀ´¿´±íÏÖ²ã´úÂ룺
public partial class HomeController : Controller { private readonly ProductRepository repository;
public HomeController(ProductRepository repository)
{
if (repository == null)
{
throw new ArgumentNullException("repository");
}
this.repository = repository;
}
public ViewResult Index()
{
var productService = new ProductService(this.repository);
var vm = new FeaturedProductsViewModel();
var products = productService.GetFeaturedProducts(this.User);
foreach (var product in products)
{
var productVM = new ProductViewModel(product);
vm.Products.Add(productVM);
}
return View(vm);
}
} |
ÔÚHomeControllerµÄ¹¹Ô캯ÊýÖУ¬´«ÈëÁËʵÏÖÁËProductRepository³éÏóÀàµÄÒ»¸öʵÀý£¬È»ºó½«¸ÃʵÀý±£´æÔÚ¶¨ÒåµÄ˽ÓеÄÖ»¶ÁµÄProductRepositoryÀàÐ͵Ärepository¶ÔÏóÖУ¬Õâ¾ÍÊǵäÐ͵Äͨ¹ý¹¹Ô캯Êý×¢Èë¡£ÔÚIndex·½·¨ÖУ¬»ñÈ¡Êý¾ÝµÄProductServiceÀàÖеÄÖ÷Òª¹¦ÄÜ£¬Êµ¼ÊÉÏÊÇͨ¹ý´«ÈëµÄrepositoryÀàÀ´´úÀíÍê³ÉµÄ¡£
ProductServiceÀàÊÇÒ»¸ö´¿´âµÄÁìÓò¶ÔÏó£¬ÊµÏÖÈçÏ£º
public class ProductService { private readonly ProductRepository repository;
public ProductService(ProductRepository repository)
{
if (repository == null)
{
throw new ArgumentNullException("repository");
}
this.repository = repository;
}
public IEnumerable<DiscountedProduct>
GetFeaturedProducts(IPrincipal user)
{
if (user == null)
{
throw new ArgumentNullException("user");
}
return from p in
this.repository.GetFeaturedProducts()
select p.ApplyDiscountFor(user);
}
} |
¿ÉÒÔ¿´µ½ProductServiceÒ²ÊÇͨ¹ý¹¹Ô캯Êý×¢ÈëµÄ·½Ê½£¬±£´æÁËʵÏÖÁËProductReposity³éÏóÀàµÄʵÀý£¬È»ºó½èÖú¸ÃʵÀýÖеÄGetFeatureProducts·½·¨£¬»ñÈ¡ÔʼÁбíÊý¾Ý£¬È»ºó½øÐдòÕÛ´¦Àí£¬½ø¶øÊµÏÖÁË×Ô¼ºµÄGetFeaturedProducts·½·¨¡£ÔÚ¸ÃGetFeaturedProducts·½·¨ÖУ¬¸ú֮ǰ²»Í¬µÄµØ·½ÔÚÓÚ£¬ÏÖÔڵIJÎÊýÊÇIPrincipal£¬¶ø²»ÊÇ֮ǰµÄboolÐÍ£¬ÒòΪÅжÏÓû§µÄ×´¿ö£¬ÕâÊÇÒ»¸öÒµÎñÂß¼£¬²»Ó¦¸ÃÔÚ±íÏֲ㴦Àí¡£IPrincipalÊÇBCLÖеÄÀàÐÍ£¬ËùÒÔ²»´æÔÚ¶îÍâµÄÒÀÀµ¡£ÎÒÃÇÓ¦¸Ã»ùÓÚ½Ó¿Ú±à³ÌIPrincipalÊÇÓ¦ÓóÌÐòÓû§µÄÒ»ÖÖ±ê×¼·½Ê½¡£
ÕâÀォIPrincipal×÷Ϊ²ÎÊý´«µÝ¸øÄ³¸ö·½·¨£¬È»ºóÔÙÀïÃæµ÷ÓÃʵÏֵķ½Ê½ÊÇÒÀÀµ×¢ÈëÖеķ½·¨×¢ÈëµÄÊֶΡ£ºÍ¹¹Ô캯Êý×¢ÈëÒ»Ñù£¬Í¬ÑùÊǽ«ÄÚ²¿ÊµÏÖ´úÀí¸øÁË´«ÈëµÄÒÀÀµ¶ÔÏó¡£
ÏÖÔÚÎÒÃÇֻʣÏÂÁ½¿éµØ·½Ã»Óд¦ÀíÁË£º
ûÓÐProductRepositoryµÄ¾ßÌåʵÏÖ£¬Õâ¸öºÜÈÝÒ×ʵÏÖ£¬ºóÃæ·Åµ½Êý¾Ý·ÃÎʲãÀïÃæÈ¥´¦Àí£¬ÎÒÃÇÖ»ÐèÒª´´½¨Ò»¸ö¾ßÌåµÄʵÏÖÁËProductRepositoryµÄÊý¾Ý·ÃÎÊÀ༴¿É¡£
ĬÈÏÉÏ£¬ASP.NET MVC Ï£ÍûController¶ÔÏóÓÐ×Ô¼ºµÄĬÈϹ¹Ô캯Êý£¬ÒòΪÎÒÃÇÔÚHomeControllerÖÐÌí¼ÓÁËÐµĹ¹Ô캯ÊýÀ´×¢ÈëÒÀÀµ£¬ËùÒÔMVC¿ò¼Ü²»ÖªµÀÈçºÎ½â¾ö´´½¨ÊµÀý£¬ÒòΪÓÐÒÀÀµ¡£Õâ¸öÎÊÌâ¿ÉÒÔͨ¹ý¿ª·¢Ò»¸öIControllerFactoryÀ´½â¾ö£¬¸Ã¶ÔÏó¿ÉÒÔ´´½¨Ò»¸ö¾ßÌåµÄProductRepositryʵÀý£¬È»ºó´«¸øHomeControllerÕâÀï²»¶à½²¡£
ÏÖÔÚÎÒÃǵÄÁìÓòÂß¼²ãÒѾдºÃÁË¡£Ôڸò㣬ÎÒÃÇÖ»²Ù×÷ÁìÓòÄ£ÐͶÔÏó£¬ÒÔ¼°.NET BCL ÖеĻù±¾¶ÔÏó¡£Ä£ÐÍʹÓÃPOCOsÀ´±íʾ£¬ÃüÃûΪProduct¡£ÁìÓòÄ£ÐÍ²ã±ØÐëÄܹ»ºÍÍâ½ç½øÐн»Á÷(database)£¬ËùÒÔÐèÒªÒ»¸ö³éÏóÀà(Repository)À´Ê±Íê³ÉÕâÒ»¹¦ÄÜ£¬²¢ÇÒÔÚ±ØÒªµÄʱºò£¬¿ÉÒÔÌæ»»¾ßÌåʵÏÖ¡£
2.1.3 Êý¾Ý·ÃÎʲã
ÏÖÔÚÎÒÃÇ¿ÉÒÔʹÓÃLINQ to EntityÀ´ÊµÏÖ¾ßÌåµÄÊý¾Ý·ÃÎʲãÂß¼ÁË¡£ÒòΪҪʵÏÖÁìÓòÄ£Ð͵ÄProductRepository³éÏóÀ࣬ËùÒÔÐèÒªÒýÈëÁìÓòÄ£ÐͲ㡣עÒ⣬ÕâÀïµÄÒÀÀµ±ä³ÉÁËÊý¾Ý·ÃÎʲãÒÀÀµÁìÓòÄ£ÐͲ㡣¸ú֮ǰµÄÇ¡ºÃÏà·´£¬´úÂëʵÏÖÈçÏ£º
public class SqlProductRepository : Domain.ProductRepository { private readonly CommerceObjectContext context;
public SqlProductRepository(string connString)
{
this.context =
new CommerceObjectContext(connString);
}
public override IEnumerable<Domain.Product>
GetFeaturedProducts()
{
var products = (from p in this.context.Products
where p.IsFeatured
select p).AsEnumerable();
return from p in products
select p.ToDomainProduct();
}
} |
ÔÚÕâÀïÐèҪעÒâµÄÊÇ£¬ÔÚÁìÓòÄ£ÐͲãÖУ¬ÎÒÃǶ¨ÒåÁËÒ»¸öÃûΪProductµÄÁìÓòÄ£ÐÍ£¬È»ºóÔÙÊý¾Ý·ÃÎʲãÖÐEntity
Framework°ïÎÒÃÇÒ²Éú³ÉÁËÒ»¸öÃûΪProductµÄÊý¾Ý·ÃÎʲãʵÌ壬ËûÊǺÍdbÖеÄProduct±íÒ»Ò»¶ÔÓ¦µÄ¡£ËùÒÔÎÒÃÇÔÚ·½·¨·µ»ØµÄʱºò£¬ÐèÒª°ÑÀàÐÍ´ÓdbÖеÄProductת»»ÎªÁìÓòÄ£ÐÍÖеÄPOCOs
Product¶ÔÏó¡£

Domain ModelÖеÄProductÊÇÒ»¸öPOCOsÀàÐ͵ĶÔÏó£¬Ëû½ö½ö°üº¬ÁìÓòÄ£ÐÍÖÐÐèÒªÓõ½µÄһЩ»ù±¾×ֶΣ¬DataAccessÖеÄProduct¶ÔÏóÊÇÓ³Éäµ½DBÖеÄʵÌ壬Ëü°üº¬Êý¾Ý¿âÖÐProduct±í¶¨ÒåµÄËùÓÐ×ֶΣ¬ÔÚÊý¾Ý±íÏÖ²ãÖÐÎÒÃÇ
¶¨ÒåÁËÒ»¸öProductViewModelÊý¾ÝÕ¹ÏÖµÄModel¡£
ÕâÁ½¸ö¶ÔÏóÖ®¼äµÄת»»ºÜ¼òµ¥£º
public class Product { public Domain.Product ToDomainProduct() { Domain.Product p = new Domain.Product(); p.Name = this.Name; p.UnitPrice = this.UnitPrice; return p; } } |
2.2 ·ÖÎö
2.2.1 ÒÀÀµ¹ØÏµÍ¼
ÏÖÔÚ£¬Õû¸öϵͳµÄÒÀÀµ¹ØÏµÍ¼ÈçÏ£º

±íÏÖ²ãºÍÊý¾Ý·ÃÎʲ㶼ÒÀÀµÁìÓòÄ£ÐͲ㣬ÕâÑù£¬ÔÚÇ°ÃæµÄcaseÖУ¬Èç¹ûÎÒÃÇÐÂÌí¼ÓÒ»¸öUI½çÃæ£»¸ü»»Ò»ÖÖÊý¾ÝÔ´µÄ´æ´¢ºÍ»ñÈ¡·½Ê½£¬Ö»ÐèÒªÐ޸ĶÔÓ¦²ãµÄ´úÂë¼´¿É£¬ÁìÓòÄ£ÐͲ㱣³ÖÁËÎȶ¨¡£
2.2.2 ʱÐòͼ
Õû¸öϵͳµÄʱÐòͼÈçÏ£º

ϵͳÆô¶¯µÄʱºò£¬ÔÚGlobal.asaxÖд´½¨ÁËÒ»¸ö×Ô¶¨ÒåÁËController¹¤³§À࣬ӦÓóÌÐò½«Æä±£´æÔÚ±¾µØ±ãÁ½ÖÖ£¬µ±Ò³ÃæÇëÇó½øÀ´µÄʱºò£¬³ÌÐò³ö·¢¸Ã¹¤³§ÀàµÄCreateController·½·¨£¬²¢²éÕÒweb.configÖеÄÊý¾Ý¿âÁ¬½Ó×Ö·û´®£¬½«Æä´«µÝ¸øÐµÄSqlProductRepositoryʵÀý£¬È»ºó½«SqlProductRepositoryʵÀý×¢Èëµ½HomeControllÖУ¬²¢·µ»Ø¡£
È»ºóÓ¦Óõ÷ÓÃHomeControllerµÄʵÀý·½·¨IndexÀ´´´½¨ÐµÄProductServiceÀ࣬²¢Í¨¹ý¹¹Ô캯Êý´«ÈëSqlProductRepository¡£ProductServiceµÄGetFeaturedProducts
·½·¨´úÀí¸øSqlProductRepositoryʵÀýȥʵÏÖ¡£
×îºó£¬·µ»ØÌî³äºÃÁËFeaturedProductViewModelµÄViewResult¶ÔÏó¸øÒ³Ã棬ȻºóMVC½øÐкÏÊʵÄÕ¹ÏÖ¡£
2.2.3 еĽṹ
ÔÚ1.1µÄʵÏÖÖУ¬²ÉÓÃÁËÈý²ã¼Ü¹¹£¬ÔڸĽøºóµÄʵÏÖÖУ¬ÔÚUI²ãºÍÁìÓòÄ£ÐͲãÖмÓÈëÁËÒ»¸ö±íÏÖÄ£ÐÍ(presentation
model)²ã¡£ÈçÏÂͼ£º

½«ControllersºÍViewModel´Ó±íÏÖ²ãÒÆµ½Á˱íÏÖÄ£ÐͲ㣬½ö½ö½«ÊÓͼ(.aspxºÍ.ascxÎļþ)ºÍ¾ÛºÏ¸ù¶ÔÏó(Composition
Root)±£ÁôÔÚÁ˱íÏÖ²ãÖС£Ö®ËùÒÔÕâÑù´¦Àí£¬ÊÇ¿ÉÒÔʹµÃ¾¡¿ÉÄܵÄʹµÃ±íÏÖ²ãÄܹ»¿ÉÅäÖöøÆäËû²¿·Ö¾¡¿ÉÄܵĿÉÒÔ±£³Ö²»±ä¡£
3. ½áÓï
Ò»²»Ð¡ÐÄÎÒÃǾͱàд³öÁ˽ôñîºÏµÄ´úÂ룬ÓÐʱºòÒÔΪ·Ö²ãÁ˾ͿÉÒÔ½â¾öÕâÒ»ÎÊÌ⣬µ«ÊÇ´ó¶àÊýµÄʱºò£¬¶¼Ã»ÓÐÕýÈ·µÄʵÏֲַ㡣֮ËùÒÔÈÝÒ×д³ö½ôñîºÏµÄ´úÂëÓÐÒ»¸öÔÒòÊÇÒòΪ±à³ÌÓïÑÔ»òÕß¿ª·¢»·¾³ÔÊÐíÎÒÃÇÖ»ÒªÐèÒªÒ»¸öеÄʵÀý¶ÔÏ󣬾ͿÉÒÔʹÓÃnew¹Ø¼ü×ÖÀ´ÊµÀý»¯Ò»¸ö¡£Èç¹ûÎÒÃÇÐèÒªÌí¼ÓÒÀÀµ£¬Visual
StudioÓÐЩʱºò¿ÉÒÔ×Ô¶¯°ïÎÒÃÇÌí¼ÓÒýÓá£ÕâʹµÃÎÒÃǺÜÈÝÒ׾ͷ¸´í£¬Ê¹ÓÃnew¹Ø¼ü×Ö£¬¾Í¿ÉÄÜ»áÒýÈëÒÔÀ´£»Ìí¼ÓÒýÓþͻá²úÉúÒÀÀµ¡£
¼õÉÙnewÒýÈëµÄÒÀÀµ¼°½ôñîºÏ×îºÃµÄ·½Ê½ÊÇʹÓù¹Ô캯Êý×¢ÈëÒÀÀµÕâÖÖÉè¼ÆÄ£Ê½£º¼´Èç¹ûÎÒÃÇÐèÒªÒ»¸öÒÀÀµµÄʵÀý£¬Í¨¹ý¹¹Ô캯Êý×¢Èë¡£ÔÚµÚ¶þ¸ö²¿·ÖµÄʵÏÖÑÝʾÁËÈçºÎÕë¶Ô³éÏó¶ø²»ÊǾßÌå±à³Ì¡£
¹¹Ô캯Êý×¢ÈëÊÇ·´×ª¿ØÖƵÄÒ»¸öÀý×Ó£¬ÒòΪÎÒÃÇ·´×ªÁ˶ÔÒÀÀµµÄ¿ØÖÆ¡£²»ÊÇʹÓÃnew¹Ø¼ü×Ö´´½¨Ò»¸öʵÀý£¬¶øÊǽ«ÕâÖÖÐÐΪίÍиøÁ˵ÚÈý·½ÊµÏÖ¡£
Ï£Íû±¾ÎÄÄܹ»¸ø´ó¼ÒÁ˽âÈçºÎÕæÕýʵÏÖÈý²ã¼Ü¹¹£¬±àдËÉÉ¢ñîºÏ£¬¿Éά»¤£¬¿É²âÊÔÐԵĴúÂëÌṩһЩ°ïÖú¡£
|