Ò»£ºÃæÏò¶ÔÏóÉè¼ÆÖÐ×î¼òµ¥µÄ²¿·ÖÓë×îÄѵIJ¿·Ö
Èç¹û˵ÊÂÎñ½Å±¾ÊÇ ÃæÏò¹ý³Ì µÄ£¬ÄÇôÁìÓòÄ£Ð;ÍÊÇ ÃæÏò¶ÔÏó µÄ¡£ÃæÏò¶ÔÏóµÄÒ»¸öºÜÖØÒªµÄµã¾ÍÊÇ£º¡°°ÑÊÂÇé½»¸ø×îÊʺϵÄÀàÈ¥×ö¡±£¬¼´£º¡°ÄãµÃÔÚÒ»¸ö¸öÁìÓòÀàÖ®¼äÌø×ª£¬²ÅÄÜÕÒ³öËûÃÇÈçºÎ½»»¥¡±£¬Martin
Flower ˵ÕâÊÇÃæÏò¶ÔÏóÖÐ×îÄѵIJ¿·Ö£¬Õâ¾ßÓÐÎ󵼵ijɷݡ£È·ÇеØËµ£¬ÎÒÃÇ×÷Ϊ³ÌÐòÔ±Èç¹ûÒÑ¾ÕÆÎÕÁË OOD
ºÍ OOP Öм¼ÊõÊֶΣ¬ÄÇôÈçºÎѰÕÒÀàÖ®¼äµÄ¹ØÏµ£¬¿ÉÄܾͳÉÁË×îÄѵIJ¿·Ö¡£µ«ÔÚʵ¼ÊµÄÇé¿öÖУ¬¼´±ãÎÒÃDz»ÊdzÌÐòÔ±£¬Ò²×ÜÄÜÃèÊöÒ»¼þÊÂÇ飨¼´Ñ°Çó¹ØÏµ£©£¬ËùÒÔ£¬ÕÒ
¶ÔÏóÖ®¼äµÄ¹ØÏµ »¹ÕæµÄ²¢²»ÊdzÌÐòÔ±×î¹ØÏµµÄ²¿·Ö£¬´Ó¼¼Êõ²ãÃæÀ´½²£¬Ñ°ÕÒÀàÖ®¼äµÄ¹ØÏµÒòΪÓë¾ßÌåµÄ±àÂë¼¼ÇÉÎ޹أ¬ËùÒÔËüÏÖÔÚ¶ÔÓÚ³ÌÐòÔ±µÄÎÒÃÇÀ´Ëµ£¬Ó¦¸ÃÊÇ×î¼òµ¥µÄ²¿·Ö£¬¼¼ÊõÊֶβÅÊÇÕâÀïÃæµÄ×îÄѲ¿·Ö¡£
ºÃ£¬ÇÐÈëÕýÌâ¡£
¶þ£º¹¹ÖþÀàÖ®¼äµÄ¹ØÏµ£¨×î¼òµ¥²¿·Ö£©
ÏÈÀ´Íê³É×î¼òµ¥µÄ²¿·Ö£¬¼´ÕÒ¹ØÏµ¡£Ò²¾ÍÊÇ˵£¬°´ÕÕËùνµÄ¹ØÏµ£¬ÎÒÃÇÀ´Öع¹ ÊÂÎñ½Å±¾ ÖеĴúÂë¡£ÉÏÆª¡°ÄãÔÚÓÃʲô˼Ïë±àÂ룺ÊÂÎñ½Å±¾
OR ÃæÏò¶ÔÏ󣿡±ÖÐͬÑùµÄÐèÇó£¬Èç¹ûÓÃÁìÓòģʽÀ´×öµÄ»°£¬ÎÒÃÇ´ó¸Å¿ÉÒÔÕâÑùÉè¼Æ£º

£¨±¸×¢£ºProduct ºÍ RecognitionStrategy Ϊ * ¨C> 1 µÄ¹ØÏµÊÇÒòΪ
Ò»ÖÖÈ·ÈÏËã·¨¿ÉÒÔ±»¶à¸ö²úÆ·µÄʵÀý¶ÔÏóʹÓã©
´ÓÏÂÃæµÄʾÀý´úÂëÎÒÃǾͿÉÒÔ¿´µ½Õâµã£º
class RevenueRecognition
{
private double amount;
private DateTime recognizedOn;
public RevenueRecognition(double amount, DateTime recognizedOn)
{
this.amount = amount;
this.recognizedOn = recognizedOn;
}
public double GetAmount()
{
return this.amount;
}
public bool IsRecognizedBy(DateTime asOf)
{
return asOf.CompareTo(this.recognizedOn) > 0 || asOf.CompareTo(this.recognizedOn) == 0;
}
}
class Contract
{
// ¶à ¶Ô 1 µÄ¹ØÏµ£¬* -> 1¡£¼´£ºÒ»¸ö²úÆ·¿ÉÓжà¸öºÏͬ¶©µ¥
private Product product;
private long id;
// ºÏͬ½ð¶î
private double revenue;
private DateTime whenSigned;
// 1 ¶Ô ¶à µÄ¹ØÏµ£¬ 1 -> *
private List revenueRecognitions = new List();
public Contract(Product product, double revenue, DateTime whenSigned)
{
this.product = product;
this.revenue = revenue;
this.whenSigned = whenSigned;
}
public void AddRevenueRecognition(RevenueRecognition r)
{
revenueRecognitions.Add(r);
}
public double GetRevenue()
{
return this.revenue;
}
public DateTime GetWhenSigned()
{
return this.whenSigned;
}
// µÃµ½ÄÄÌìǰÈëÕËÁ˶àÉÙ
public double RecognizedRevenue(DateTime asOf)
{
double re = 0.0;
foreach(var r in revenueRecognitions)
{
if(r.IsRecognizedBy(asOf))
{
re += r.GetAmount();
}
}
return re;
}
public void CalculateRecognitions()
{
product.CalculateRevenueRecognitions(this);
}
}
class Product
{
private string name;
private RecognitionStrategy recognitionStrategy;
public Product(string name, RecognitionStrategy recognitionStrategy)
{
this.name = name;
this.recognitionStrategy = recognitionStrategy;
}
public void CalculateRevenueRecognitions(Contract contract)
{
recognitionStrategy.CalculateRevenueRecognitions(contract);
}
public static Product NewWordProcessor(string name)
{
return new Product(name, new CompleteRecognitionStrategy());
}
public static Product NewSpreadsheet(string name)
{
return new Product(name, new ThreeWayRecognitionStrategy(60, 90));
}
public static Product NewDatabase(string name)
{
return new Product(name, new ThreeWayRecognitionStrategy(30, 60));
}
}
abstract class RecognitionStrategy
{
public abstract void CalculateRevenueRecognitions(Contract contract);
}
class CompleteRecognitionStrategy : RecognitionStrategy
{
public override void CalculateRevenueRecognitions(Contract contract)
{
contract.AddRevenueRecognition(new RevenueRecognition(contract.GetRevenue(), contract.GetWhenSigned()));
}
}
class ThreeWayRecognitionStrategy : RecognitionStrategy
{
private int firstRecognitionOffset;
private int secondRecognitionOffset;
public ThreeWayRecognitionStrategy(int firstRoff, int secondRoff)
{
this.firstRecognitionOffset = firstRoff;
this.secondRecognitionOffset = secondRoff;
}
public override void CalculateRevenueRecognitions(Contract contract)
{
contract.AddRevenueRecognition(
new RevenueRecognition(contract.GetRevenue() / 3, contract.GetWhenSigned()));
contract.AddRevenueRecognition(
new RevenueRecognition(contract.GetRevenue() / 3,
contract.GetWhenSigned().AddDays(firstRecognitionOffset)));
contract.AddRevenueRecognition(
new RevenueRecognition(contract.GetRevenue() / 3,
contract.GetWhenSigned().AddDays(secondRecognitionOffset)));
}
}
|
ÕýÏñÎÒ˵µÄ£¬ÒÔÉϵĴúÂëÊÇ×î¼òµ¥²¿·Ö£¬Ã¿¸ö OOP µÄ³õѧÕß¶¼ÄÜд³öÕâÑùµÄ´úÂëÀ´¡£µ«ÊÇÎÒÐÄÏ룬¼´±ãÎÒÃÇÄÜд³öÕâÑùµÄ´úÂëÀ´£¬ÎÒÃÇ¿ÖŶ¼²»»áÐÄÐéµÄ¸æËß×Ô¼º£ºÊǵģ¬ÎÒÕýÔÚ½øÐÐÁìÓòÇý¶¯¿ª·¢°É¡£
ÄÇô£¬ÕæÕýÄѵIJ¿·ÖÊÇʲô£¿
2.1 ÁìÓòÄ£ÐÍ ¶ÔÓÚ³ÌÐòÔ±À´ËµÕæÕýÀ§ÄÑ»òÕßÀ§»óµÄ²¿·Ö
ÊÇÁìÓòÄ£Ðͱ¾ÉíÔõôºÍÆäËüÄ£¿é£¨»òÕ߯äËü²ã£©½øÐн»»¥£¬ÕâЩ½»»¥»òÕß˵¹ØÏµÊÇ£º
1£ºÁìÓòÄ£ÐÍ ×ÔÉí¾ß±¸Ð©Ê²Ã´ÓïÑÔ²ãÃæµÄÌØÐÔ£»
2£ºÁìÓòÄ£ÐÍ ºÍ ÁìÓòÄ£ÐÍ Ö®¼äµÄ¹ØÏµ£»
3£ºÁìÓòÄ£ÐÍ ºÍ Repository µÄ¹ØÏµ£»
4£º¹¤×÷µ¥Ôª ºÍ ÁìÓòÄ£ÐÍ ¼° Repository µÄ¹ØÏµ£»
5£ºÁìÓòÄ£ÐÍ µÄ»º´æ£»
6£ºÁìÓòÄ£ÐÍ ºÍ »á»°Ö®¼äµÄ¹ØÏµ£»
Èý£ºÄÇЩ½»»¥Óë¹ØÏµ
3.1 ÁìÓòÄ£ÐÍ ×ÔÉí¾ß±¸Ð©Ê²Ã´ÓïÑÔ²ãÃæµÄÌØÐÔ
ÏÈ¿´´úÂ룺
public class User2 : DomainObj
{
#region Field
#endregion
#region Property
#endregion
#region ÁìÓò×ÔÉíÂß¼
#endregion
#region ÁìÓò·þÎñ
#endregion
}
|
¶ÔÓÚÒ»¸öÁìÓòÄ£ÐÍÀ´Ëµ£¬´ÓÓïÑÔ²ãÃæÀ´½²£¬Ëü¾ß±¸ 5 ·½ÃæµÄÌØÐÔ£º
1£ºÓи¸À࣬·ÅÖù«¹²µÄÊôÐÔÖ®ÀàµÄÄÚÈÝ£¬Í¬Ê±£¬´æÔÚÒ»¸ö¸¸À࣬Ҳ±íʾËü²»ÊÇÒ»¸ö
Öµ¶ÔÏó£¨ÁìÓò¸ÅÄîÖеÄÖµ¶ÔÏ󣩣»
2£ºÓÐʵÀý×ֶΣ»
3£ºÓÐʵÀýÊôÐÔ£»
4£ºÁìÓò×ÔÉíÂß¼£¬·Ç static ·½·¨£¬ÓÐ public µÄºÍ ·Çpublic£»
5£ºÁìÓò·þÎñ£¬static ·½·¨£¬¿É¶ÀÁ¢³öÈ¥·ÅÖõ½¶ÔÓ¦µÄ ·þÎñÀà ÖУ»
ÏÖÔÚ£¬ÎÒÃǾßÌåÕ¹¿ªÒ»Ï¡£²»¹ý£¬ÎªÁËÕ¹¿ª½²£¬ÎÒÃDZØÐëÌṩһ¸öÉÔÉÔÍêÕûµÄ User2
µÄÀý×Ó£¬ËüÔÚÕæÕýµÄÏîÄ¿ÊÇÕâ¸öÑù×ӵģº
public class User2 : DomainObj
{
#region Field
private Organization2 organization;
private List myTests;
private List myClasses;
#endregion
#region Property
public override IRepository RootRep
{
get { return RepRegistory.UserRepository; }
}
public string UserName { get; private set; }
public string Password { get; private set; }
/* ÑÝʾÁËͬʱ´æÔÚ Organization ºÍ OrganizationId Á½¸öÊôÐÔµÄÇé¿ö */
public string OrganizationId { get; private set; }
public Organization2 Organization
{
get
{
if (organization == null && !string.IsNullOrEmpty(OrganizationId))
{
organization = Organization2.FindById(OrganizationId);
}
return organization;
}
}
/* ÑÝʾÁË´æÔÚ Áбí ÊôÐÔµÄÇé¿ö */
public List MyClasses
{
get
{
if (myClasses == null)
{
myClasses = YhbjClass.GetClassesByUserId(this);
}
return myClasses;
}
}
public List MyTests
{
get
{
/* ÎҵĿ¼ÊÔÀ´×ÔÁ½¸öµØ·½£¬1£º°à¼¶¡¢ÏîÄ¿ÉϵĿ¼ÊÔ£»2£ºÑ¡È˵Ŀ¼ÊÔ£»
* ¹Ê£¬ÓÐÁ½ÖÖÉè¼Æ·½·¨
* 1£ºÑ¡È˵Ŀ¼ÊÔûÓÐÒÉÒ飻
* 2£º°à¼¶¡¢ÏîÄ¿¿¼ÊÔ£¬¿ÉÒÔ´Ó±¾Ä£Ð굀 Classes -> Projects -> Tests »ñÈ¡£»
* 3£ºÒ²¿ÉÒÔÖ±½Ó´ÓÊý¾Ý¿âµÃµ½»ñÈ¡£»
* ÔÚÕâÀïµÄʵ¼ÊʵÏÖ£¬²ÉÓÃµÚ 2 ÖÖ×ö·¨¡£ÒòΪ£º
* 1£ºÊý¾Ý±¾ÉíÊÇ»º´æµÄ£¬µÚÒ»»ñÈ¡µÄʱºò£¬Ã²ËÆ´æÔÚ¶à´Î²éѯ£¬µ«ÊÇÒ»µ©»ñÈ¡¾Í»º´æÁË£»
* 2£º´æÔÚºÜ¶àµØ·½µÄÊý¾ÝÒ»ÖÂÐÔÎÊÌ⣬²ÉÓ÷½·¨ 3 Ã²ËÆ¿ìËÙÁË£¬µ«»á´øÀ´²»¿ÉÖª BUG £»
* 3£º¼´±ã½«À´¿¼ÊÔ»¹ÓпγÌÉϵĿ¼ÊÔ£¬¿ÉÒԺܷ½±ãµÄ»ñÈ¡£¬²»È»»¹ÐèÒªÖØ¸Ä SQL£»
*/
if (myTests == null)
{
myTests = new List();
/* ¼ÓÖ¸¶¨È˵Ŀ¼ÊÔ£¬ÕâЩ¿¼ÊÔûÓжÔÓ¦µÄ ÏîÄ¿ ºÍ °à¼¶*/
myTests.AddRange(YhbjTest.GetTestsByUserId(this.Id));
/* ¼Ó°à¼¶µÄ¿¼ÊÔ£¬ÓжÔÓ¦µÄ °à¼¶ */
foreach (var c in MyClasses)
{
myTests.AddRange(c.Tests);
foreach (var t in c.Tests)
{
t.SetOwnerClass(c);
}
/* ¼ÓÏîÄ¿µÄ¿¼ÊÔ£¬ÓжÔÓ¦µÄ °à¼¶ ºÍ ÏîÄ¿£¬´úÂëÂÔ */
}
}
/* ÆäËüÂß¼ */
foreach (var test in myTests)
{
if (test.TestHistory == null)
{
test.SetHistory(MyTestHistories
.FirstOrDefault(p => p.TestId == test.Id && p.UserId == this.Id));
}
}
return myTests;
}
}
#endregion
#region ÁìÓò×ÔÉíÂß¼
public void InitWithOrganization(Organization2 o)
{
/* ÔÚÕâ¸ö·½·¨Öв»Óà MakeDirty£¬ÒòΪÏ൱ÓÚ³õʼ»¯·ÖΪÁ½²½½øÐÐÁË
*/
this.organization = o;
}
/* ²»ÐèÒª¶ÔÍ⿪·ÅµÄÂß¼£¬Ê¹Óà internal*/
internal virtual void UpdateOnline(string loginTime, string token, string loginIp, string loginPort)
{
/* ÕâÑù×öµÄºÃ´¦ÊÇÊ²Ã´ÄØ£¿
* createnew ·½·¨Óû§²»¸ºÔð×Ô¼ºµÄ³Ö¾Ã»¯£¬¶øÊÇÓÉÊÂÎñ´úÂë½øÐиºÔð
* µ«ÊÇ createnew ·½·¨»á±êʶ×Ô¼ºÎª new£¬¼´ makenew ·½·¨µ÷ÓÃ
* È»ºó£¬ÓÉÓÚ ut ÓõͼÊÇͬһ¸ö ut£¬ËùÒÔÔÚÊÂÎñÕâÀï commit ÁË
* ¾ÍÊÇ commit ÁË ¸ù ºÍ ·Ç¸ù
* ÕâÀïҲͬʱÑÝʾÁ˶à¸öÁìÓò¶ÔÏó¹²ÓÃÒ»¸ö ut
*/
this.UnitOfWork = new UnitOfWork();
UserOnline2 userOnline2Old = UserOnline2.GetUserOnline(this.UserName);
if (userOnline2Old != null)
{
userOnline2Old.UnitOfWork = this.UnitOfWork;
userOnline2Old.Delete();
}
UserOnline2 = UserOnline2.CreateNew(UserName, loginIp, loginPort);
UnitOfWork.RegisterNew(UserOnline2);
UnitOfWork.Commit();
}
/* ¶ÔÍ⿪·ÅµÄÂß¼£¬Ê¹Óà public */
public List GetMyTest(string testName, int type, int page, int size, out int totalCount)
{
IEnumerable expName = from p in MyTests orderby p.CreateTime descending select p;
IEnumerable expState = null;
switch (type)
{
case 0:
/* δ¿¼
* ÐèÒªÅųýµô ÓÐЧÆÚ Ö®Íâ
*/
expState =
from p in expName
where
p.StartTime <= DateTime.Now &&
p.EndTime >= DateTime.Now &&
(this.MyTestHistories.Exists(q => q.TestId == p.Id) == false
|| (this.MyTestHistories.Exists(q => q.TestId == p.Id) ==
true && this.myTestHistories.Find(h => h.TestId == p.Id).TestState != 1)) &&
p.AuditState == AuditState.Audited
select p;
break;
default:
throw new ArgumentOutOfRangeException();
}
var re = expState.ToList();
totalCount = re.Count;
return re.Skip((page - 1) * size).Take(size).ToList();
}
public YhbjTest StartTest(string testId)
{
// Âß¼ÂÔ
}
#endregion
///
/// 1£º·þÎñÊÇÎÞ״̬µÄ£¬ËùÒÔÊÇ static µÄ
/// 2£º·þÎñÊǹ«¿ªµÄ£¬ËùÒÔÊÇ public µÄ
/// 3£º·þÎñʵ¼ÊÊÇ¿ÉÒÔ´´½¨×¨ÃŵķþÎñÀàµÄ£¬ÕâÀïΪÁËÑÝʾÐèÒª£¬¾Í·ÅÔÚÒ»ÆðÁË
///
#region ÁìÓò·þÎñ
/* ÕâÁ½¸ö×Ö¶ÎÑÝʾÆäʵ·þÎñ²¿·ÖµÄ´úÂëÊÇËæÒâµÄ */
private static readonly CookieWrapper CookieWrapper;
private static readonly HttpWrapper HttpWrapper;
static User2()
{
CookieWrapper = new CookieWrapper();
HttpWrapper = new HttpWrapper();
}
/* ÄÚ²¿µÄ·½·¨µ±È»ÊÇ˽ÓÐµÄ */
private static List GetUserPaperByUserAndTest(User2 user2, YhbjTest test)
{
var x = RepRegistory.UserRepository.FindTestUserPaper(user2, test);
return x;
}
/* »ñÈ¡ÁìÓò¶ÔÏóµÄ·½·¨£¬È«²¿ÊôÓÚÁìÓò·þÎñ²¿·Ö£¬ÔÙ´ÎÇ¿µ÷ÊǾ²Ì¬µÄ */
public static User2 GetUserByName(string username)
{
var user = (RepRegistory.UserRepository).FindByName(username);
return user as User2;
}
/* ÁìÓò¶ÔÏóµÄ»ñÈ¡ºÍ²úÉú£¬»¹ÓÐÁíÍâµÄ×ö·¨£¬¾ÍÊÇÔÚ¶ÔÏ󹤳§ÖÐÉú³É£¬µ«Õâ²»ÊôÓÚ±¾ÎÄÒª²ûÊöµÄ·¶³ë */
public static User2 CreateCreater(
string creatorOrganizationId, string creatorOrganizationName, string id, string name)
{
var user = new User2 { Id = id, Name = name, UnitOfWork = new UnitOfWork() };
user.MakeNew();
return user;
}
#endregion
} |
Çë×Ðϸ²é¿´ÉÏÃæ´úÂ룬ΪÁ˱¾ÎĽÓÏÂÀ´µÄ²ûÊö£¬ÉÏÃæµÄ´úÂ뼸ºõ¶¼ÊÇÓÐÒâÒåµÄ£¬ÎÒÒѾºÜ¾«¼òÁË¡£
ºÃÁË£¬»ùÓÚÉÏÃæÕâ¸öÀý×Ó£¬ÎÒÃÇÕ¹¿ª½²£º
1£º¸¸Àà
public abstract class DomainObj
{
public Key Key { get; set; }
///
/// ¸ù²Ö´¢
/// TIP: ÒòΪÊdzäѪģʽ£¬ËùÒÔÿ¸öÁìÓòÄ£ÐͶ¼ÓÐÒ»¸ö¸ù²Ö´¢
/// ÓÃÓÚÌá½»×ÔÉíµÄ±ä¶¯
///
public abstract IRepository RootRep { get; }
protected DomainObj()
{
}
public UnitOfWork UnitOfWork { get; set; }
public string Id { get; protected set; }
public string Name { get; protected set; }
protected void MakeNew()
{
UnitOfWork.RegisterNew(this);
}
protected void MakeDirty()
{
UnitOfWork.RegisterDirty(this);
}
protected void MakeRemoved()
{
UnitOfWork.RegisterRemoved(this);
}
}
|
¸¸Àà°üº¬ÁË£¬ÈÃÒ»¸ö ÁìÓòÄ£ÐÍ ³ÉΪ ÁìÓòÄ£ÐÍ Ëù±Ø±¸µÄÄÇÐ©ÌØµã£¬ËüÓÐ ±êʶӳÉ䣨¼Ü¹¹Ä£Ê½¶ÔÏóÓë¹ØÏµ½á¹¹Ä£Ê½Ö®£º±êʶÓò£¨Identity
Field£©£©£¬Ëü³ÖÓÐ ¹¤×÷µ¥Ôª£¨£©£¬Ëü¸ºÔðµ÷Óà ¹¤×÷µ¥ÔªµÄAPI£¨»»¸ö½Ç¶È˵¹¤×÷µ¥Ôª£¨Unit Of
Work£©£º´´½¨¡¢³ÖÓÐÓëAPIµ÷Óã©¡£
Èç¹ûÎÒÃǵĶÔÏóÊÇÒ»¸ö ÁìÓòÄ£ÐͶÔÏó£¬ÄÇôËü±Ø¶¨ÐèÒª¼Ì³ÐÖ®Õâ¸ö¸¸Àࣻ
2£ºÓÐʵÀý×Ö¶Î
ÓÐÈË¿ÉÄÜ»áÓÐÒÉÎÊ£¬²»ÊÇÓÐÊôÐԾͿÉÒÔÁËÂð£¬ÎªÊ²Ã´ÒªÓÐ×ֶΣ¬Ò»¸öÀíÓÉÊÇ£¬Èç¹ûÎÒÃÇÐèÒª ÑÓ³Ù¼ÓÔØ£¨£©£¬¾ÍÐèҪʹÓÃ×Ö¶ÎÀ´½øÐи¨Öú¡£ÎÒÃÇÔÚÉÏÃæµÄÔ´ÂëÖп´µ½µÄ
if XX == NULL £¬ÕâÑùµÄÊôÐÔ´úÂ룬¾ÍÊÇÑÓ³Ù¼ÓÔØ£¬ÆäÖÐʹÓõ½ÁË×ֶΡ£×¢Ò⣬Èç¹ûʹÓÃÁËÑÓ³Ù¼ÓÔØ£¬ÄãÓ¦¸Ã»áÓöµ½ÐòÁл¯µÄÎÊÌ⣬ÕâÊÇÄãÐèҪעÒâµÄ¡¶ÑÓ³Ù¼ÓÔØÓëÐòÁл¯¡·¡£
3£ºÓÐʵÀýÊôÐÔ
ÊôÐÔÊDZØÈ»µÄ£¬Ã»ÓÐÊôÐÔµÄÁìÓòÄ£ÐͺÜÏ¡Éٵġ£Óм¸¸öµØ·½ÐèÒª´ó¼Ò×¢Ò⣬
1£ºÊôÐ﵀ get ·½·¨£¬¿ÉÒÔÊǺܸ´Ôӵģ¬ÆäµØÎ»Ï൱ÓÚÊÇÁìÓò×ÔÉíÂß¼£»
2£ºset ·½·¨£¬¶¼ÊÇ private µÄ£¬ÁìÓò¶ÔÏó×ÔÉí¸ºÔð×ÔÉíÊôÐԵĸ³Öµ£»
3£ºÔÚÓбØÒªµÄÇé¿öÏ£¬Ê¹Óà ÑÓ³Ù¼ÓÔØ£¬Õâ¿ÉÄÜÐèÒªÁíÍâÒ»¸öÖ÷ÌâÀ´½²£»
4£ºÑÓ³Ù¼ÓÔØµÄÄÇЩÊôÐÔ£¬ºÜ¶àʱºò¾ÍÊÇ µ¼º½ÊôÐÔ£¬¼´ Organization ºÍ MyClasses
ÕâÑùµÄÊôÐÔ£¬¾ÍÊǵ¼º½ÊôÐÔ£»
4£ºÁìÓò×ÔÉíÂß¼
ÁìÓò×ÔÉíÂß¼£¬°üº¬ÁËÓ¦ÓÃϵͳ´ó¶àÊýµÄÒµÎñÂß¼£¬¿ÉÒÔÀí½âΪ£ºËü¾ÍÊÇ´«Í³ 3 ²ã¼Ü¹¹ÖеÄÒµÎñÂß¼²ãµÄ´úÂë¡£Èç¹ûÒ»¶Î´úÂ룬Äã²»ÖªµÀ°ÑËü·Åµ½ÄÄÀÄÇô£¬Ëü¶à°ë¾ÍÊôÓÚÓ¦¸Ã·ÅÔÚÕâÀï¡£×¢Ò⣬ֻÓÐÓ¦¸Ã¹«¿ªµÄÄÇЩ·½·¨£¬²Å
public£»
5£ºÁìÓò·þÎñ
ÁìÓò·þÎñ£¬¿ÉÒÔ¶ÀÁ¢³öÈ¥£¬³ÉΪÁìÓò·þÎñÀà¡£ÄÇô£¬Ê²Ã´ÑùµÄ´úÂëÊÇÁìÓò·þÎñ´úÂ룿µÚÒ»ÖÖÇé¿ö£º
Éú³ÉÁìÓò¶ÔÏóʵÀýµÄ·½·¨£¬¶¼Ó¦¸ÃÊÇÁìÓò·þÎñÀà¡£Èç ²éѯ »òÕß Create
New¡£
ÔÚʵ¼Ê³¡¾°ÖУ¬ÎÒÃÇ¿ÉÄÜʹÓöÔÏ󹤳§À´Éú³ÉËüÃÇ£¬ÕâÀïΪÁË´¿´âµÄÑÝʾÄÄЩÊÇ ÁìÓò×ÔÉíÂß¼£¬ÄÄЩÊÇ ÁìÓò·þÎñ£¬ÌØÒâʹÓÃÁËÁìÓòÀàµÄ
static ·½·¨À´Éú³ÉÁìÓò¶ÔÏó¡£¼´£º
ÁìÓò¶ÔÏ󣬲»ÄÜËæ±ã±»Íâ½çÉú³É£¬ÒªÑϸñ¿ØÖÆÆäÉú³É¡£ËùÒÔÁìÓò¸¸ÀàµÄ¹¹ÔìÆ÷£¬ÎÒÃÇ¿´µ½ÊÇ protected µÄ¡£
ÄÇô£¬Êµ¼ÊÉÏ£¬³ýÁËÉÏÃæÕâÖÖÇé¿öÍ⣬ÈκδúÂë¶¼Ó¦¸ÃÊÇ ÁìÓò×ÔÉíÂß¼µÄ¡£ÎÒÔÚÉÏÃæ»¹ÑÝʾÁËÕâÑùµÄÒ»¶Î´úÂ룺
private static List<PaperQuestionStrategy3> GetUserPaperByUserAndTest(User2 user2, YhbjTest test) { var x = RepRegistory.UserRepository.FindTestUserPaper(user2, test); return x; } |
Õâ¶Î´úÂ룬ʵ¼ÊÉÏ×÷ΪÁìÓò·þÎñ²¿·Ö£¬¾ÍÊÇ´íÎóµÄ£¬ËüÓ¦¸Ã±»·ÅÖÃÔÚ YhbjTest
Õâ¸öÁìÓòÀàÖС£
3.2 ÁìÓòÄ£ÐÍ ºÍ ÁìÓòÄ£ÐÍ Ö®¼äµÄ¹ØÏµ
Ò²¾ÍÊÇ˵ÄÇЩµ¼º½ÊôÐÔºÍÁìÓòÄ£ÐÍÓÐʲô¹ØÏµ¡£µ¼º½ÊôÐÔ±ØÐë¶¼ÊÇÑÓ³Ù¼ÓÔØµÄÂ𣿵±È»²»ÊÇ¡£±ÈÈ磬
User ËùÔÚµÄ Organization£¬ÎÒÃÇÔÚÔÚʹÓõ½Óû§Õâ¸ö¶ÔÏóµÄʱºò£¬¼¸ºõ×ÜÊÇҪʹÓõ½Æä×éÖ¯ÐÅÏ¢£¬ÄÇô£¬ÎÒÃÇÔÚ»ñÈ¡Óû§µÄʱºò£¬¾ÍÓ¦¸ÃÁ¢¼´»ñÈ¡µ½×éÖ¯¶ÔÏó£¬ÄÇô£¬ÎÒÃǵij־û¯´úÂëÊÇÕâÑùµÄ£º
public override DomainObj Find(Key key)
{
var user = base.Find(key) as User2;
if (user == null)
{
//
string sql = @"
DECLARE @ORGID VARCHAR(32)='';
SELECT @ORGID=OrganizationId FROM [EL_Organization].[USER] WHERE ID=@Id
SELECT * FROM [EL_Organization].[USER] WHERE ID=@Id
SELECT * FROM [EL_Organization].[ORGANIZATION] WHERE ID=@ORGID";
var pms = new SqlParameter[]
{
new SqlParameter("@Id", key.GetId())
};
var ds = SqlHelper.ExecuteDataset(CommandType.Text, sql, pms);
user = DataTableHelper.ToList(ds.Tables[0]).FirstOrDefault();
var o = DataTableHelper.ToList(ds.Tables[1]).FirstOrDefault();
if (user == null)
{
return null;
}
user = Load(user);
// ×¢Ò⣬³ýÁË Load User »¹ÐèÒª Load Organization
user.InitWithOrganization(o);
Load(user.Organization);
return user;
}
return user;
}
|
¿ÉÒÔ¿´µ½£¬ÎÒÃÇÔÚÒ»´Î sql Ö´ÐеÄʱºò£¬¾ÍµÃµ½ÁË organization£¬È»ºó£¬User2 ÀàÐÍÖУ¬ÓиöÊôÓÚÁìÓò×ÔÉíÂß¼·½·¨£º
public void InitWithOrganization(Organization2 o)
{
/* ÔÚÕâ¸ö·½·¨Öв»Óà MakeDirty£¬ÒòΪÏ൱ÓÚ³õʼ»¯·ÖΪÁ½²½½øÐÐÁË
*/
this.organization = o;
}
|
ÔÚÕâÀïÒª¶à˵һÏ£¬Èç¹û²»Êdzõʼ»¯Ê±ºòµÄ¸ÄÊôÐÔ£¬ÈçÐÞ¸ÄÁËÓû§µÄ×éÖ¯ÐÅÏ¢£¬¾ÍÓ¦¸Ã MakeDirty¡£
×¢Ò⣬»¹ÓÐÒ»¸ö±È½ÏÖØÒªµÄÁìÓò×ÔÉíÂß¼£¬¾ÍÊÇ SetOwned£¬ÈçÏ£º
public void SetOwnerClass(YhbjClass yhbjClass) { this.OwnerClass = yhbjClass; /* should not makeDirty, but if class repalced or removed, should makedirty*/ } |
±ÈÈ磬ÁìÓòÄ£ÐÍ ¿¼ÊÔ£¬¾Í¿ÉÄÜ»áÓÐÕâ¸ö·½·¨£¬¿¼ÊÔ±¾ÉíÐèÒªÖªµÀ£ºÎÒÊôÓÚÄĸö°à¼¶¡£
3.3 ÁìÓòÄ£ÐÍ ºÍ Repository Ö®¼äµÄ¹ØÏµ
µÚÒ»£¬Èç¹ûÎÒÃÇÔÚʹÓà ÁìÓòÄ£ÐÍ£¬ÎÒÃDZØÐëʹÓà Repository ģʽÂ𣿴ð°¸ÊÇ£ºµ±È»²»ÊÇ£¬ÎÒÃÇ¿ÉÒÔʹÓÃ
»î¶¯¼Ç¼ģʽ£¨Ê²Ã´Êǻ¼Ç¼£¬µ±Ç°ÎÒÃÇ¿ÉÒÔÔÝʱÀí½âΪ´«Í³3²ã¼Ü¹¹ÖеÄDAL²ã£©¡£Èç¹ûÎÒÃÇÔÚʹÓà Repository
£¬ÄÇô£¬ÁìÓòÄ£ÐÍºÍ Respository Ö®¼äÊÇʲô¹ØÏµÄØ£¿ÕâÀÓÐÁ½µãÐèÒª²ûÊö£º
µÚÒ»µãÊÇ£¬Ò»°ãµÄ×ö·¨£¬Repository ÊDZ»×¢ÈëµÄ£¬Ëü¿ÉÄܱ»×¢È뵽ϵͳµÄij¸öµØ·½£¬Ê¾Àý´úÂëÊDZ»×¢Èëµ½ÁËÀàÐÍ
RepRegistoryÖС£
ÁìÓòÄ£ÐÍÒª²»ÒªÊ¹Óà Repository£¬ÎҵĴð°¸ÊÇ£ºÒª¡£
Ϊʲô£¬ÒòΪÎÒÃÇÒªÈÃÁìÓòÂß¼×Ô¼º¾ö¶¨ºÏÊʵ÷Óà Repository¡£
µÚ¶þµãÊÇ£¬Ã¿¸öÁìÓòÄ£ÐͶ¼ÓÐÒ»¸ö RootRep£¬ÓÃÓÚ×ÔÉíÒÔ¼°°Ñ×ÔÉíµ±³É¸ùµÄÄÇЩµ¼º½ÊôÐÔ¶ÔÏóµÄ³Ö¾Ã»¯²Ù×÷£»
3.4 ¹¤×÷µ¥Ôª ºÍ ÁìÓòÄ£ÐÍ ¼° Repository µÄ¹ØÏµ
ÕâÒ»µã±È½Ï¸´ÔÓ£¬ÎÒÃǵ¥¶ÀÔÚ ¡¶»»¸ö½Ç¶È˵¹¤×÷µ¥Ôª£¨Unit Of Work£©£º´´½¨¡¢³ÖÓÐÓëAPIµ÷Óá·
½øÐÐÁ˲ûÊö¡£µ±È»£¬¸ú Repository Ò»Ñù£¬Ê¹Óà ÁìÓòÄ£ÐÍ£¬±ØÐëʹÓà ¹¤×÷µ¥Ôª Â𣿴ð°¸Ò²ÊDz»ÊÇ¡£Ö»ÊÇ£¬ÔÚʹÓÃ
¹¤×÷µ¥Ôª ºó£¬¸üÒ×ÓÚÎÒÃÇ´¦Àí ÁìÓòÄ£ÐÍ ÖеÄÊÂÎñÎÊÌâ¡£
3.5 ÁìÓòÄ£Ð͵Ļº´æ
»º´æ·ÖΪÁ½À࣬µÚÒ»ÀàÎÒÃÇ¿ÉÒÔ³ÆÖ®Îª Ò»¼¶»º´æ£¬Õâ¶ÔÓÚ¿Í»§¶Ë³ÌÐòÔ±À´Ëµ£¬²»¿É¼û£¬Ëü±»·ÅÖÃÔÚ
AbstractRepository ÖУ¬ÍùÍùÔÚµ±Ç°ÇëÇóÖÐÓÐÓãº
public abstract class AbstractRepository : IRepository
{
/* LoadedDomains ÔÚÓÐЩÎÄÏ×ÖпÉÒÔ×÷Ϊ¸ßËÙ»º´æ£¬µ«ÊÇÕâ¸ö»º´æ¿É²»ÊÇÖ¸µÄ
* ÒµÎñÉϵÄÄǸö»º´æ£¬¶øÊÇ Æ¬¶Î µÄ»º´æ£¬Ö¸ÔÚµ±Ç°ÊµÀýµÄÉúÃüÖÜÆÚÖеĻº´æ¡£
* ÒµÎñÉϵĻº´æÔÚÎÒÃǵÄϵͳÖУ¬ÓÉÿ¸öÁìÓòÄ£Ð͵ķþÎñ²¿·Ö×ÔÉí³ÖÓС£
*/
protected Dictionary<Key, DomainObj> LoadedDomains = new Dictionary<Key, DomainObj>();
public virtual DomainObj Find(Key key)
{
if (LoadedDomains.ContainsKey(key))
{
return LoadedDomains[key] as DomainObj;
}
else
{
return null;
}
//return null;
}
public abstract void Insert(DomainObj t);
public abstract void Update(DomainObj t);
public abstract void Delete(DomainObj t);
public void CheckLoaedDomains()
{
foreach (var m in LoadedDomains)
{
Console.WriteLine(m.Value);
}
}
///
/// µ±»º´æÄÚÈÝ·¢Éú±ä¶¯Ê±½øÐÐÖØÖÃ
///
/// <param name="keyField">»º´ækeyµÄid</param> /// <param name="type">»º´æµÄ¶ÔÏóÀàÐÍ</param>
public void ResetLoadedDomainByKey(string keyId,Type type)
{
var key=new Key(keyId,type);
if (LoadedDomains.ContainsKey(key))
{
LoadedDomains.Remove(key);
}
}
protected T Load(T t) where T : DomainObj
{
var key = new Key(t.Id, typeof (T));
/* 1£ºÕâÒ»¾äºÜÖØÒª£¬ÒòΪÎÒÃDz»»áÏëÒª·Åµ½Ã¿¸ö×ÓÀàÀïÈ¥¸³Öµ
* 2£ºÆä´Î£¬Èç¹û×ÓÀàûÓе÷Óà Load £¬ÔòÓÀԶûÓÐ Key£¬²»¹ýÕâ˵µÃ¹ýÈ¥
*/
t.Key = key;
if (LoadedDomains.ContainsKey(key))
{
return LoadedDomains[key] as T;
}
else
{
LoadedDomains.Add(key, t);
return t;
}
//return t;
}
protected List LoadAll(List ts) where T : DomainObj
{
for (int i = 0; i < ts.Count; i++)
{
ts[i] = Load(ts[i]);
}
return ts;
}
}
|
ÒµÎñϵͳÖеĻº´æ£¬ÐèÒªÎÒÃÇËæ×ÅÒµÎñϵͳ×ÔÉíµÄÌØµã£¬×Ô¼ºÀ´´´½¨£¬±ÈÈ磬Èç¹ûÎÒÃÇÕë¶Ô
User2 Õâ¸öÁìÓòÄ£Ðͽ¨Á¢»º´æ£¬¾ÍÓ¦¸Ã°ÑÕâ¸ö»º´æ¹Ò½Óµ½µ±Ç°»á»°ÖС£´Ë´¦²»±í¡£
3.6 ÁìÓòÄ£ÐÍ Óë »á»°Ö®¼äµÄ¹ØÏµ
ÕâÊÇÒ»¸öÓÐÒâ˼µÄ»°Ì⣬ÎÞÂÛÊÇÀíÂÛÉÏ»¹ÊÇʵ¼ÊÖУ¬ÔÚÒ»´Î»á»°µ±ÖУ¨Èç¹ûÎÒÃǻỰµÄ²ÎÕÕÖУ¬¿ÉÒÔ»ØÎ¶Ï ASP.NET
ÖÐµÄ Session£¬ËüÃÇËù±í´ïµÄ¸ÅÄîÊÇÒ»Öµģ©£¬Ö»Òª»á»°²»Ê§Ð§£¬ÄÇô ÁìÓò¶ÔÏó µÄ״̬£¬¾ÍÓ¦¸ÃÊDZ»±£³ÖµÄ¡£ÕâÀïÄѵÄÊÇ£¬ÎÒÃÇÔõôÀ´´´½¨Õâ¸ö
Session¡£Session »Øµ½ÓïÑÔ²ãÃæ£¬¾ÍÊÇÒ»¸öÀ࣬Ëü¿ÉÄܻὫÁìÓò¶ÔÏó±£³ÖÔÚ ÄÚ´æÖУ¬»òÕßÎļþÖУ¬»òÕßÊý¾Ý¿âÖУ¬»òÕßÔÚÒ»¸ö·Ö²¼Ê½ÏµÍ³ÖУ¨Èç
Memcached£¬¡¶ASP.NETÐÔÄÜÓÅ»¯Ö®·Ö²¼Ê½Session¡·£©¡£
×î¼òµ¥µÄ£¬ÎÒÃÇ¿ÉÒÔʹÓà ASP.NET µÄ Session À´±£´æÎÒÃǵĻỰ£¬È»ºó°ÑÁìÓò¶ÔÏó´æ´¢µ½ÕâÀï¡£
ËÄ£º×ܽá
ÒÔÉÏÃèÊöÁËÈÃÁìÓòÄ£ÐͳÉΪÁìÓòÄ£Ð͵ÄһЩ×î»ù±¾µÄ¼¼ÊõÊֶΡ£½â¾öÁËÕâЩ¼¼ÊõÊֶΣ¬ÎÒÃǵĿª·¢²Å»ù±¾ËãÊÇ DDD
µÄ£¬²ÅÊÇÃæÏòÁìÓòÄ£Ð͵ġ£½â¾öÁËÕâЩ¼¼ÊõÎÊÌ⣬½ÓÏÂÀ´£¬ÎÒÃDzÅÄܺÁÎÞºó¹ËÖ®ÓǵØÈ¥½â¾ö Martin Flower
Ëù˵µÄ×îÄѵIJ¿·Ö£º¡°ÄãµÃÔÚÒ»¸ö¸öÁìÓòÀàÖ®¼äÌø×ª£¬²ÅÄÜÕÒ³öËûÃÇÈçºÎ½»»¥¡±¡£
|