Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
dz̸ÒÀÀµ×¢Èë
 
×÷Õߣºº®½­¶Àµö À´Ô´£º²©¿ÍÔ° ·¢²¼ÓÚ£º2015-10-30
  2414  次浏览      27

×î½ü¼¸ÌìÔÚ¿´Ò»±¾ÃûΪ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¹Ø¼ü×Ö´´½¨Ò»¸öʵÀý£¬¶øÊǽ«ÕâÖÖÐÐΪίÍиøÁ˵ÚÈý·½ÊµÏÖ¡£

Ï£Íû±¾ÎÄÄܹ»¸ø´ó¼ÒÁ˽âÈçºÎÕæÕýʵÏÖÈý²ã¼Ü¹¹£¬±àдËÉÉ¢ñîºÏ£¬¿Éά»¤£¬¿É²âÊÔÐԵĴúÂëÌṩһЩ°ïÖú¡£

   
2414 ´Îä¯ÀÀ       27
 
Ïà¹ØÎÄÕÂ

iOSÓ¦Óð²È«¿ª·¢£¬Äã²»ÖªµÀµÄÄÇЩÊÂÊõ
Web°²È«Ö®SQL×¢Èë¹¥»÷
ÒÆ¶¯APP°²È«ÔÚÉøÍ¸²âÊÔÖеÄÓ¦ÓÃ
´ÓGoogle±¸·Ý»¥ÁªÍø¿´¡°Êý¾Ý°²È«¡±
 
Ïà¹ØÎĵµ

web°²È«Éè¼ÆÓë·À»¤
»¥ÁªÍøº£Á¿ÄÚÈݰ²È«´¦Àí¼¼Êõ
ºÚ¿Í¹¥»÷Óë·À·¶¼¼Êõ
WEBºÚºÐ°²È«¼ì²â
 
Ïà¹Ø¿Î³Ì

WEBÍøÕ¾ÓëÓ¦Óð²È«Ô­ÀíÓëʵ¼ù
webÓ¦Óð²È«¼Ü¹¹Éè¼Æ
´´½¨°²È«µÄJ2EE WebÓ¦ÓôúÂë
ÐÅÏ¢°²È«ÎÊÌâÓë·À·¶
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

iOSÓ¦Óð²È«¿ª·¢
Web°²È«Ö®SQL×¢Èë¹¥»÷
APP°²È«ÔÚÉøÍ¸²âÊÔÖеÄÓ¦ÓÃ
³õ̽PHPµÄSQL×¢Èë¹¥»÷µÄ¼¼Êõ
´ÓGoogle±¸·Ý¿´¡°Êý¾Ý°²È«¡±

WEBÍøÕ¾ÓëÓ¦Óð²È«Ô­ÀíÓëʵ¼ù
webÓ¦Óð²È«¼Ü¹¹Éè¼Æ
´´½¨°²È«µÄJ2EE WebÓ¦ÓôúÂë
×¢²áÐÅÏ¢°²È«×¨ÒµÈËÔ±(CISP)
ÐÅÏ¢°²È«¹ÜÀí
ÐÅÏ¢°²È«ÎÊÌâÓë·À·¶

ÖйúÒøÐÐ ÐÅÏ¢°²È«¼¼Êõ¼°Éî¶È·ÀÓù
WebÓ¦Óð²È«¼Ü¹¹¡¢ÈëÇÖ¼ì²âÓë·À»¤
ij²ÆË°ÁìÓòÖªÃûIT·þÎñÉÌ Web°²È«²âÊÔ
ÆÕÈð¿Ë˹ web°²È«Éè¼Æ¡¢²âÊÔÓëÓÅ»¯
±±¾©ºÍÀûʱ ÐÔÄܺͰ²È«ÐÔ²âÊÔ
SUNÖйú¹¤³ÌÑо¿Ôº JSF¿ò¼Ü¡¢°²È«