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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÃæÏò¶ÔÏó¼Ü¹¹Ä£Ê½Ö®£ºÁìÓòÄ£ÐÍ£¨Domain Model£©
 
×÷ÕߣºLuminji À´Ô´£º²©¿ÍÔ°  ·¢²¼ÓÚ 2015-01-08
  7703  次浏览      27
 

Ò»£ºÃæÏò¶ÔÏóÉè¼ÆÖÐ×î¼òµ¥µÄ²¿·ÖÓë×îÄѵ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¿·Ö£º¡°ÄãµÃÔÚÒ»¸ö¸öÁìÓòÀàÖ®¼äÌø×ª£¬²ÅÄÜÕÒ³öËûÃÇÈçºÎ½»»¥¡±¡£

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

ΪʲôҪ×ö³ÖÐø²¿Êð£¿
ÆÊÎö¡°³ÖÐø½»¸¶¡±£ºÎå¸öºËÐÄʵ¼ù
¼¯³ÉÓë¹¹½¨Ö¸ÄÏ
³ÖÐø¼¯³É¹¤¾ßµÄÑ¡Ôñ-×°ÔØ
 
Ïà¹ØÎĵµ

³ÖÐø¼¯³É½éÉÜ
ʹÓÃHudson³ÖÐø¼¯³É
³ÖÐø¼¯³ÉÖ®-ÒÀÀµ¹ÜÀí
IPD¼¯³É²úÆ·¿ª·¢¹ÜÀí
Ïà¹Ø¿Î³Ì

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

ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
Visitor Parttern
ÓÉ±í¼°À￴ģʽ
Éè¼ÆÄ£Ê½Ëæ±ÊϵÁÐ
ÉîÈëdz³öÉè¼ÆÄ£Ê½-½éÉÜ
.NETÖеÄÉè¼ÆÄ£Ê½
Ïà¹ØÅàѵ¿Î³Ì

J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Ó¦ÓÃģʽÉè¼ÆJavaÆóÒµ¼¶Ó¦ÓÃ
Éè¼ÆÄ£Ê½Ô­ÀíÓëÓ¦ÓÃ
J2EEÉè¼ÆÄ£Ê½Ö¸ÄÏ
µ¥Ôª²âÊÔ+ÖØ¹¹+Éè¼ÆÄ£Ê½
Éè¼ÆÄ£Ê½¼°ÆäCSharpʵÏÖ

ijµçÁ¦¹«Ë¾ Éè¼ÆÄ£Ê½Ô­Àí
À¶ÍØÆË Éè¼ÆÄ£Ê½Ô­Àí¼°Ó¦ÓÃ
ÎÀÐǵ¼º½ UML & OOAD
ÌÀɭ·͸Ñз¢ÖÐÐÄ UML& OOAD
Öдïµçͨ Éè¼ÆÄ£Ê½Ô­Àí
Î÷ÃÅ×Ó Ç¶ÈëʽÉè¼ÆÄ£Ê½
 
 
 
¡¡