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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
³õ̽ÁìÓòÇý¶¯Éè¼Æ--RepositoryÔÚDDDÖеÄÓ¦ÓÃ
 
×÷ÕߣºJesse Liu£¬À´Ô´£º²©¿ÍÔ° ·¢²¼ÓÚ£º2014-12-11
  6346  次浏览      28
 

¸ÅÊö

ÉÏһƪÎÒÃÇËãÊÇ´ÖÂԵĽéÉÜÁËÒ»ÏÂDDD£¬ÎÒÃÇÌáµ½ÁËʵÌå¡¢ÖµÀàÐͺÍÁìÓò·þÎñ£¬Ò²ÉÔ΢½²µ½ÁËDDDÖеķֲã½á¹¹¡£µ«ÕâÖ»ÄÜËãÊÇÒ»¸öºÜ¼òµ¥µÄ½éÉÜ£¬²¢ÇÒÎÒÃÇÔÚÉÏÆªµÄĩβ»¹ÁôÏÂÁËһЩÎÊÌ⣬ÆäÖдó¼ÒÌÖÂ۱Ƚ϶àµÄ£¬Ò²ÊÇÎÒ±¾ÈË֮ǰÓÐһЩÒÉÎʵĵط½¾ÍÊÇRepository¡£ÎÒ֮ǰ¾õµÃIRepositoryºÍÈý²ãÀïÃæµÄIDALºÜÏñ£¬ÎªÊ²Ã´ÒªÕû³öÕâô¸ö¶«Î÷À´£»ÓÐÈË˵ÓÃEFµÄ»°¾Í²»ÐèÒªRepositoryÁË£»IRepositoryÊǼ¦Àߵȵȡ£ ÎÒ¾õµÃÕâЩÎÊÌâ¶¼ºÜºÃ£¬ÎÒ×Ô¼ºÒ²¾õµÃÓÐÎÊÌ⣬´ø×ÅÕâЩÎÊÌâÎÒÃǾÍÀ´¿´Ò»¿´RepositoryÔÚDDDÖе½µ×Æð×ÅÒ»¸öʲôÑùµÄ½ÇÉ«£¬ËüΪʲô´æÔÚ£¿ÓÐÒ»¾äÕæÀí²»ÊÇ˵¡°´æÔÚ¼´ºÏÀí¡±Ã´£¿ ÄÇÎÒÃǾÍÒªÕÒµ½Ëü´æÔÚµÄÀíÓÉ£¬È¥¸üºÃµÄÀí½âËü£¬»òÕß˵ÎÒÃÇÄܲ»ÄÜÕë¶Ô²»Í¬µÄÐèÇóÈ¥¸ÄÔìËüÄØ£¿×¢£º±¾ÎÄÌÖÂÛµÄÊÇRepositoryÔÚDDDÖеÄÓ¦Óã¬ÓëEF¸Ã²»¸ÃÓÃRepoistory²»ÊÇͬһ¸ö»°Ìâ¡£

EFÓëRepository

ÔÚÉÏһƪ¡¶³õ̽ÁìÓòÇý¶¯Éè¼Æ£¨1£©Îª¸´ÔÓÒµÎñ¶øÉú¡·ÖУ¬ÎÒÃÇÒѾ­ÊµÏÖÁËÒ»¸öÓû§×¢²áµÄÀý×Ó£¬µ«ÊDz¢²»ÍêÕû¡£ÎÒÃÇ»¹Ã»ÓоßÌåµÄʵÏÖRepository£¬¼´Ê¹ÊÇÔÚ²âÊÔµÄʱºòÎÒÃÇʹÓõÄÒ²ÊÇÒ»¸öMock¡£ÄÇô½ñÌ죬ÎÒÃǾÍÀ´ÊµÏÖÒ»¸öEntityFrameworkµÄRepository¡£ÓÐÈË˵EFûÓбØÒªÌ×Ò»¸öRepository£¬ÎÒÊÇͬÒâµÄ¡£µ«ÊDz»Í¬µÄ³¡¾°£¬²»Í¬µÄʹÓ÷½·¨£¬ÎÒÃÇÏÂÃæÔÙ¾ßÌå½²¡£ÎÒÃÇÔÚÉÏһƪÖÐÒѾ­Ìáµ½ÁËIRepositoryµÄ½Ó¿Ú¶¨Ò壬ÏÂÃæÊÇÎÒÃǵļòµ¥ÊµÏÖ£º

// EFRepository.cs

namespace RepositoryAndEf.Data
{
public class EfRepository<T> : IRepository<T> where T : BaseEntity
{
private DbContext _context;

public EfRepository(DbContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
_context = context;
}

public T GetById(Guid id)
{
return _context.Set<T>().Find(id);
}

public bool Insert(T entity)
{
_context.Set<T>().Add(entity);
_context.SaveChanges();
return true;
}
public bool Update(T entity)
{
_context.Set<T>().Attach(entity);
_context.Entry<T>(entity).State = EntityState.Modified;
_context.SaveChanges();
return true;
}

public bool Delete(T entity)
{
_context.Set<T>().Remove(entity);
_context.SaveChanges();
return true;
}


public IEnumerable<T> Get(Expression<Func<T, bool>> predicate)
{
return _context.Set<T>().Where(predicate).ToList();
}
}
}

// Ó¦ÓòãUserService.cs

public class UserService : IUserService
{
    private IRepository _userRepository;

    public UserService(IRepository userRepository)
    {
        _userRepository = userRepository;
    }

    public User Register(string email, string name, string password)
    {
        var domainUserService = new Domain.UserService(_userRepository);
        var user = domainUserService.Register(email, name, password);
        return user;
    }
}

// ÁìÓò²ãUserService.cs

namespace RepositoryAndEf.Domain
{
    public class UserService
    {
        private IRepository _userRepository;

        public UserService(IRepository userRepsoitory)
        {
            _userRepository = userRepsoitory;
        }

        public virtual User Register(string email, string name, string password)
        {
            if (_userRepository.Get().Any(u => u.Email == email))
            {
                throw new ArgumentException("The email is already taken");
            }

            var user = new User
            {
                Id = Guid.NewGuid(),
                Email = email,
                Name = name,
                Password = password
            };

            user.CreateShoppingCart();
            _userRepository.Insert(user);
            return user;
        }
    }
}

ÉÏÃæÁìÓò²ãUserServiceÖеĴúÂëºÍÎÒÃÇÉÏһƪÖеĴúÂëÊÇÒ»ÑùµÄ£¬netfocusÐÖÌá³öÀ´Ò»¸öÎÊÌâ¡°ÊDz»ÊǰÑuser¶ÔÏó¼ÓÈëµ½repositoryÖоÍËãÍê³É×¢²áÁË£¿¡± ÏÖÔÚ¿´À´£¬Èç¹û´úÂëÕâÑùд£¬ºÃÏñ¾ÍÒѾ­Íê³ÉÁË×¢²áµÄ¹¦ÄÜ¡£ µ«ÊÇÈç¹ûÕæÕâÑùд£¬ÎÒÓÖ¾õµÃÎÊÌâ¸ü´ó£¬Ò²¾ÍÊÇΪʲôÎÒ»áÔÚÉÏÆªµÄδ±ØÁôÏÂÄǸöÎÊÌ⣬¡°Domain -> Repository -> Database¡± ºÍ¡°BLL -> Dal -> Database¡± ÓÐÇø±ðô£¿Æ²¿ªÕâ¸öÎÊÌⲻ˵£¬¿´¿´ÎÒÃÇÉÏÃæµÄEfRepositoryÓÐûÓÐʲôÎÊÌ⣿ ºÃÓÃô£¿ÏÖÔÚºÃÏñûÓа취ʹÓÃÊÂÎñ°¡£¡´ø×ÅÕâ¸öÎÊÌâÎÒÃÇÀ´¿´¿´Unit Of WorkÄÜÔõô°ïÎÒÃÇ¡£

Unit Of Work Óë Repository

ÎÒÃÇEfRepositoryµÄʵÏÖÖУ¬Ã¿Ò»´ÎInsert/Update/Delete²Ù×÷±»Ö´ÐÐÖ®ºó£¬±ä¸ü¾Í»áÁ¢¼´Í¬²½µ½Êý¾Ý¿âÖÐÈ¥¡£µÚÒ»£¬ÎÒÃÇûÓÐΪ¶à¸ö²Ù×÷Ìí¼ÓÒ»¸öÊÂÎñµÄÄÜÁ¦£»µÚ¶þ£¬Õâ»áΪÎÒÃÇ´øÀ´ÐÔÄÜÉϵÄËðʧ¡£¶øUnit Of WorkģʽÕýºÃ½â¾öÁËÎÒÃǵÄÎÊÌ⣬ÏÂÃæÊÇMartin Fowler ¶ÔÓÚ¸ÃģʽµÄ½âÊÍ£º

¡°A Unit of Work keep track of everything you do during a business transaction that can affect the database. When you¡¯re done, it figures out everything that need to be done to alter the database as a result of your work.¡±

Unit of Work¸ºÔð¸ú×ÙËùÓÐÒµÎñÊÂÎñ¹ý³ÌÖÐÊý¾Ý¿âµÄ±ä¸ü¡£µ±ÊÂÎñÍê³ÉÖ®ºó£¬ËüÕÒ³öÐèÒª´¦ÀíµÄ±ä¸ü£¬²¢¸üÐÂÊý¾Ý¿â¡£

ÕýÈçÎÒÃÇ´ó¼ÒÒ»Ö±ÌÖÂÛµÄÄÇÑù£¬ÔÚEFÖУ¬DBContextËü±¾Éí¾ÍÒѾ­ÊÇÒ»¸öUnit Of WorkµÄģʽ£¬ÒòΪÉÏÃæËµµÄ¹¦ÄÜËü¶¼ÓС£ÄÇÎÒÃÇÓбØÒª×Ô¼ºÔÙ¸øËü°üÉÏÒ»²ãÂð£¿ÎҵĴð°¸Êǿ϶¨µÄ£¬Õâ¸öºÍÎÒÃÇΪRepository½¨Á¢½Ó¿ÚÊÇÒ»ÑùµÄ£¬EFÖеÄIDbSet¾ÍÊÇÒ»¸öRepositoryģʽ£¬µ«ÊÇËûÃǶ¼ÊÇEFÀïÃæµÄ¶«Î÷£¬Èç¹ûÄÄÌìÎÒÃÇ»»³ÉNHibernateÁË£¬ÎÒÃDz»¿ÉÄÜΪÁËÕâÒ»¸ö½Ó¿ÚºÍ»ùÀà°ÑEFÕâ¸ödllÒ²¼Ó½øÀ´ÊÇô£¿ ÎÒÃÇÒª×öµÄ²¢²»¶à£¬ÒòΪDbContext.SaveChangesËü±¾Éí¾ÍÊÇÓÐÊÂÎñµÄ£¬ËùÒÔÎÒÃÇÖ»ÐèÒª´´½¨Ò»¸ö´øÓÐSaveChangesµÄ½Ó¿Ú¾Í¿ÉÒÔÁË¡£

// IUnitOfWork.cs

namespace RepositoryAndEf.Core.Data
{
    public interface IUnitOfWork : IDisposable
    {
        int SaveChanges();
    }
}

½ÓמÍÊÇÈÃÎÒÃǵÄContext£¬¼Ì³ÐDbContexºÍÎÒÃÇÉÏÃæµÄ½Ó¿Ú¡£

namespace RepositoryAndEf.Data
{
    public class RepositoryAndEfContext : DbContext, IUnitOfWork
    {
        public RepositoryAndEfContext() { }

        public RepositoryAndEfContext(string nameOrConnectionString)
            : base(nameOrConnectionString)
        {
            Configuration.LazyLoadingEnabled = true;
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            var typesToRegister = Assembly.GetExecutingAssembly().GetTypes()
            .Where(type => !String.IsNullOrEmpty(type.Namespace))
            .Where(type => type.BaseType != null 
                && type.BaseType.IsGenericType
                && type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>));

            foreach (var type in typesToRegister)
            {
                dynamic configurationInstance = Activator.CreateInstance(type);
                modelBuilder.Configurations.Add(configurationInstance);
            }
            //...or do it manually below. For example,
            //modelBuilder.Configurations.Add(new LanguageMap());

            base.OnModelCreating(modelBuilder);
        }
    }
}

Ŷ£¬¶ÔÁË£¬±ðÍüÁ˰ÑRepositoryÀïÃæµÄSaveChanges·½·¨È¥µô¡£

namespace RepositoryAndEf.Data
{
public class EfRepository<T> : IRepository<T> where T : BaseEntity
{
private DbContext _context;

public EfRepository(IUnitOfWork uow)
{
if (uow == null)
{
throw new ArgumentNullException("uow");
}
_context = uow as DbContext;
}

public T GetById(Guid id)
{
return _context.Set<T>().Find(id);
}

public bool Insert(T entity)
{
_context.Set<T>().Add(entity);
return true;
}

public bool Update(T entity)
{
_context.Set<T>().Attach(entity);
_context.Entry<T>(entity).State = EntityState.Modified;
return true;
}

public bool Delete(T entity)
{
_context.Set<T>().Remove(entity);
return true;
}


public IEnumerable<T> Get(Expression<Func<T, bool>> predicate)
{
return _context.Set<T>().Where(predicate).ToList();
}
}
}

ÄÇôÎÒÃÇÓ¦ÓòãµÄUserService¾Í¿ÉÒÔÕâÑùдÁË¡£

namespace RepositoryAndEf.Service
{
    public class UserService : IUserService
    {
        private IRepository _userRepository;
        private IUnitOfWork _uow = 
            EngineContext.Current.Resolve();
        public UserService(IRepository userRepository)
        {
            _userRepository = userRepository;
        }

        public User Register(string email, string name, string password)
        {
            var domainUserService = new Domain.UserService(_userRepository);
            var user = domainUserService.Register(email, name, password);
            
            // ÔÚµ÷ÓÃSaveChnages()֮ǰ£¬×öÆäËüµÄ¸üвÙ×÷
            // ËüÃÇ»áÒ»ÆðÔÚͬһ¸öÊÂÎñÖÐÖ´ÐС£
            _uow.SaveChanges();
            return user;
        }
    }
}

Èç¹û¹â¿´Õâ¶Î´úÂëÓÐûÓоõµÃºÜÆæ¹Ö£¿Ã»ÓÐÈκζÔ_userRepositoryµÄ²Ù×÷£¬¾Í×öÁËSaveChanges£¬ÒòΪÎÒÃÇÔÚÁìÓò·þÎñÀïÃæ¾ÍÒѾ­°Ñд´½¨µÄÓû§ÊµÌå·Åµ½ÄǸöuserRepositoryÖÐÈ¥ÁË¡£ÎÒÏëÕâ¸öÎÊÌâ@ÌïÔ°µÄó¬ó°¾À½á¹ýºÜ¾Ã:£© £¬Ò²¾ÍÊÇÁìÓò·þÎñÄÇÀïÃæ³ÖÓÐrepositoryµÄÒýÓã¬Ëü¿ÉÒÔ×Ô¼º½«Òª¸üеÄʵÌåÌí¼Óµ½repositoryÖУ¬µ«ÊÇÈç¹û¶ÔÓÚһЩ²»Éæ¼°µ½ÁìÓò·þÎñµÄ²Ù×÷£¬ÄÇÕâÒ»µã¾ÍÐèÒªÔÚÓ¦ÓòãÀ´×öÁË£¬±ÈÈçÌí¼ÓÉÌÆ·µ½¹ºÎï³µµÄ²Ù×÷¡£

// Ó¦ÓòãShoppingCartService.cs

namespace RepositoryAndEf.Service
{
    public class ShoppingCartService : IShoppingCartService
    {
        private IRepository _shoppingCartRepository;
        private IRepository _productRepository;
        private IUnitOfWork _uow;

        public ShoppingCartService(IUnitOfWork uow,
            IRepository shoppingCartRepository,
            IRepository productRepository)
        {
            _uow = uow;
            _shoppingCartRepository = shoppingCartRepository;
            _productRepository = productRepository;
        }

        public ShoppingCart AddToCart(Guid cartId, 
            Guid productId, 
            int quantity)
        {
            var cart = _shoppingCartRepository.GetById(cartId);
            var product = _productRepository.GetById(productId);
            cart.AddItem(product, quantity);

            _shoppingCartRepository.Update(cart);
            _uow.SaveChanges();
            return cart;
        }
    }
}

Õâ¾ÍÊÇÊôÓÚÖ°Ôð¶¨Òå²»Ã÷È·µÄÎÊÌâ£¬ÌØ±ðÊÇÉÏÃæ×¢²áÓû§µÄÀý×Ó¡£Ó¦ÓòãÒ²ÓÐ_userRepository£¬²¢ÇÒÁìÓò·þÎñ»¹¸øÎÒ·µ»ØÁËÒ»¸öuserµÄʵÌ壬ÄÇÎÒÊǰÑËü¼Óµ½Õâ¸ö_userRepositoryÖÐÄØ»¹ÊDz»¼ÓºÃÄØ£¿

ÎÒ¾õµÃÎÒÃÇÓ¦¸ÃÓÐÕâÑùµÄÒ»¸ö¶¨Ò壬ÔÚÁìÓò²ãÄÇÀﲻʹÓÃrepositoryµÄ¸üÐÂÀà²Ù×÷£¨¼´Insert/Update/Delete)£¬Ö»Ê¹ÓòéѯÀà²Ù×÷¼´£¨GetById,»òÕßÊÇGet)¡£°ÑËùÓеĸüÐÂÀà²Ù×÷¶¼·Åµ½Ó¦Óò㣬ÕâÑùÓÉÓ¦ÓòãÈ¥¾ö¶¨Ê²Ã´Ê±ºò°ÑʵÌå¸üе½repository£¬ÒÔ¼°Ê²Ã´Ê±ºòÈ¥Ìá½»µ½Êý¾Ý¿âÖС£ÄÇÎÒÃǾͳ¹µ×Óë³Ö¾Ã²ã£¬ÉõÖÁÁìÓòʵÌåÉúÃüÆÚ¹ÜÀíµÄ¹¦ÄÜÆ²¿ªÓйØÏµÁË£¬´Ó´ËÓøüOOµÄ·½Ê½×¨×¢ÓÚÒµÎñ¡£

ºóÃæÎÒÃÇÒª×öµÄ¸ü¸Ä¾ÍÊǰÑ_userRepository.Insert(user)´ÓÎÒÃÇUserµÄÁìÓò·þÎñÖÐÒÆ³ýµô£¬²¢ÇÒÔÚÓ¦ÓòãµÄRegister·½·¨ÖмÓÈëÕâ¾ä»°¡£ ÎÒÏëµ½ÕâÀҲËãÊǻشðÁËÎÒ×Ô¼ºµÄÎÊÌâ: IRepositoryÕýÈçËüµÄÃû×ÖÒ»Ñù£¬Ëü¾ÍÏñÒ»¸öÈÝÆ÷£¬ÔÊÐíÎÒÃǰѶ«Î÷·Å½øÈ¥»òÕßÈ¡³öÀ´£¬ËüÀëÕæÕýµÄÊý¾Ý¿â»¹ÓÐÒ»²½Ö®Ò££¬²¢ÇÒͨ¹ýUnit Of Work£¬°Ñ¶ÔÊÂÎñÒÔ¼°³Ö¾Ã»¯µÄ¿ØÖƶ¼½»µ½ÁËÍâÃæ¡£¶ø²»ÊÇÏñDALÄÇÑùÖ±½Ó¾Í·´Ó³µ½Êý¾Ý¿âÖÐÈ¥ÁË¡£³ý´ËÖ®ÍâÄØ£¿IRepository½â³ýÁËÁìÓò²ã¶Ô»ù´¡ÉèÊ©²ãµÄÒÀÀÁ£¬Õâ¸öÒ²ÊÇ´ó¼Ò¾­³£Ìáµ½ÁËRepositoryµÄÓŵãÖ®Ò»¡£µ«ÊÇδ±ØÕâÒ»µãÒ»¶¨·ÇµÃÐèÒªIRepository£¬°ÑIDAL½Ó¿ÚÒÆ¸öλÖÃͬÑùÒ²¿ÉÒÔʵÏÖ£¬²»ÐÅÄú¿´¿´Ñó´Ð¼Ü¹¹¡£

Ñó´Ð¼Ü¹¹ÓëIRepository

Ñó´Ð¼Ü¹¹ºÜÔç¾ÍÓУ¬Ö»²»¹ý08ÄêµÄʱºòJeffery¸øËüÈ¡Á˸öÃû×Ö£¬ÈÃËü³ÉΪÁËÒ»¸öģʽ¡£ËµÆðÀ´ºÃÏñºÜ¸ß´óÉÏ£¬µ«ÊÇÏ£Íû´ó¼Ò²»Òª±»ÕâЩÃû×ÖËùÃÔ»ó£¬ËùÕýÈçJefferyËù˵£¬ÔÚÕâÖÖÉè¼ÆÓÐÁËÒ»¸öÃû×ÖÖ®ºó£¬¸ü·½±ã´ó¼ÒÈ¥ÌÖÂۺʹ«²¥ÒÔ¼°Ê¹ÓÃÕâÖÖģʽ¡£ ²¢ÇÒÑó´Ð¼Ü¹¹Ò²ÊÇÒ»ÖÖ¶à²ã¼Ü¹¹£¬ËùÒÔ»á³öÏÖ¡°´«Í³¡± µÄ¶à²ã¼Ü¹¹ ºÍ¡°ÏÖ´ú¡±µÄ¶à²ã¼Ü¹¹¡£ ÎÒ¸üÊÇÈÏΪ£¬ËùνµÄÑó´Ð¼Ü¹¹Ö»ÊÇ×÷³öÁËÒ»µãµã˼Ïë²ãÃæÉϵÄת±ä£¬½ö´Ë¶øÒÑ¡£ ¾¿¾¹ÊÇÄÄÒ»µã˼ÏëÉϵÄת±ä£¬¿ÉÒÔÈÃËü³ÉΪһÖÖÄ£Ê½ÄØ£¿ ÒÀÀÁ¹ØÏµ£¡

Jeffery˵ÔÚ´«Í³µÄ¶à²ã¼Ü¹¹ÖУ¬Éϲã¶ÔϲãÓÐ׎ÏÇ¿µÄÒÀÀÁ¹ØÏµ£¬UIûÁËBLL¾Íû·¨¹¤×÷£¬BLLÉÙÁËDALÒ²ÎÞ·¨Õý³£ÔËÐС£µ±È»Ëû˵Õâ¾ä»°µÄʱºòÊÇ08Ä꣬²¢ÇÒËûµÄÈ·ÊÇÔÚÇ°Ãæ¼ÓÁË¡°´«Í³¡± Á½¸ö×Ö¡£ ÎÒÃǺÜÄÑÕÒµ½µ½µ×ÊÇʲôʱºò£¬ÕâÖÖ´«Í³µÄ¶à²ã¼Ü¹¹Ñݱä³ÉÁË¡°ÏÖ´ú¡± µÄ¶à²ã¼Ü¹¹£¬µ«ÊÇÎÒÃÇÄÜÖªµÀµÄÊÇÔÚ08Äê7ÔÂÒÔºóÎÒÃǶÔÓÚ¶à²ã¼Ü¹¹ÓÖÓÐÁËÒ»¸öеÄÃû´Ê¡£¼´±ãÈç´Ë£¬ËüµÄת±äÈ´ÊǷdz£¼òµ¥µÄ ¡ª¡ª Ò²¾ÍÊǰÑIDAL½Ó¿Ú´ÓDAL²ã·ÖÀë³öÈ¥¡£

Èç¹û°ÑIDAL½Ó¿Ú¶¨ÒåÔÚDataAccess²ã£¬µÚÒ»ÊÇÔì³ÉÁËBLL¶ÔDataAccessµÄÒÀÀÁ£»µÚ¶þÊÇÔì³ÉÁËIDALµÄÔðÈβ»Ã÷È·¡£Èç¹û˵СA¸ºÔ𿪷¢BLL£¬Ð¡C¸ºÔ𿪷¢DAL£¬ËûÃÇÊDz»ÊÇÐèҪЭµ÷¸ÃÔõôÑùÈ¥¶¨ÒåIDAL½Ó¿Ú£¿ ÊÇDALΪBLL·þÎñ£¬»¹ÊÇBLLµÄ×îÖÕÄ¿µØÊǰÑ×Ô¼ºÒƽ»¸øDAL£¿ ÔÚ×ʼµÄʱºò£¬´ó¼Ò¶ÔIDALµÄ¶¨ÒåÊÇΪÁËÖ§³Ö²»Í¬µÄ·ÃÎʲãÉè¼Æ£¬´ó¼ÒÏëµÄ¶¼ÊÇÏÖÔÚÎÒÃÇÓÃSQL£¬½«À´ÓпÉÄÜ»áÓÐMySql¡£ËùÒÔIDAL·ÅÔÚÄÄÀïÒ²¾ÍÎÞËùνÁË£¬ÎªÁË·½±ã¾ÍÖ±½ÓºÍʵÏÖÒ»Æð·ÅÔÚDAL°É¡£

°ÑIDAL½Ó¿Ú´ÓDALÒÆ³öÈ¥Ö®ºó»á·¢Éúʲô £¿

ÔÚ°ÑIDAL½Ó¿ÚÒÆµ½BLL²ãÖ®ºó£¬¼ýÍ·µÄ·½Ïò¾Í±äÁË¡£ÏÖÔÚÒ»Çж¼ÊÇÒÔBLLΪÖÐÐÄ£¬BLLÒ²²»ÐèÒªÒÀÀÁÓÚÈÎºÎÆäËü²ãÁË£¬×÷Ϊ¶ÀÁ¢µÄÒ»¿é£¬ÎÒÃÇ¿ÉÒÔ¸üÈÝÒ׵ĽøÐе¥Ôª²âÊÔ£¬Öع¹µÈ¡£ÁíÍâÒ²Ã÷È·ÁËIDALÊÇΪBLL·þÎñµÄ£¬Ò²¾ÍÊǽâ¾öÁËÎÒÃÇÉÏÃæÌáµ½µÄµÚ¶þ¸öÎÊÌâ¡£

Õâ¸öÒ»¸öºÜ¼òµ¥µÄת±ä¾ÍÊÇÑó´Ð¼Ü¹¹µÄÖ÷Ҫ˼Ï룬Èç¹ûÄ㻹²»ÄܺܺõÄÁìÎòÑó´Ð¼Ü¹¹ºÍ´«Í³¶à²ã¼Ü¹¹Ö®¼äµÄÇø±ð£¬Ï£ÍûÏÂÃæÕâÕÅͼÄÜÓÃ×îÖ±½Ó£¬×î¼òµ¥µÄ·½Ê½¸æËßÄã¡£

´«Í³¶à²ã¼Ü¹¹ÓëÏÖ´ú£¨Ñó´Ð¼Ü¹¹£©¶à²ã¼Ü¹¹µÄÇø±ð

ÄãÒªÊÇÔ¸Ò⣬°ÑIDALÖ±½Ó·Åµ½BllÀïÃæÒ²ÊÇ¿ÉÒԵġ£µ±Jeffery¸øÕâÖּܹ¹ÆðÃû½Ð¡°Ñó´Ð¼Ü¹¹¡±ÔÙÍùÇ°ÍÆ4Ä꣬DDDÎÊÊÀµÄʱºòÒѾ­°üº¬ÁËÕâÖÖ˼Ïë¡£IRepositoryÊôÓÚÁìÓò²ã¶ø·Ç»ù´¡¼Ü¹¹²ãÖеÄÊý¾Ý·ÃÎÊÄ£¿é£¬¾ÍÖ±½Ó±ÜÃâÁËÁìÓò²ã¶Ô»ù´¡ÉèÊ©²ãµÄÒÀÀÁ£¬»òÕß˵²»¶¨ÕâÖÖ˼ÏëÒ²ÊÇ´ÓDDDÒýÉê³öÀ´µÄ£¬ËùÒÔÄã»á·¢ÏֺܶàÈËÏÖÔÚÒÀÈ»ÓÃDAL¡£µ«ÊDz¢Ã»ÓÐʲôÎÊÌ⣬ÒòΪÔÚÕâÖÖеĶà²ã¼Ü¹¹Ï£¬À©Õ¹ÐԺͿÉά»¤ÐÔͬÑùÒ²¿ÉÒÔ±»±£³ÖµÄºÜºÃ¡£

ÖØÐ¶¨ÒåIRepository

ÏÖÔÚ£¬ÎÒÃÇÔٻعýÍ·È¥¿´Repository¡£ËüµÄÁ½´óÖ°Ôð£º

1.¶ÔÁìÓòʵÌåµÄÉúÃüÖÜÆÚ½øÐйÜÀí£¨´ÓÊý¾Ý¿âÖØ½¨£¬ÒÔ¼°³Ö¾Ã»¯µ½Êý¾Ý¿â£© ¡ª¡ª±»ÍƳٵ½ÁËÓ¦Óòã

2.½â³ýÁìÓò²ã¶Ô»ù´¡ÉèÊ©µÄÒÀÀÁ

ÔÚµÚÒ»µãÉúЧºó£¬ËùÓиüÐÂÀàµÄ²Ù×÷¶¼ÍƳٵ½Ó¦ÓòãÈ¥Ö´ÐС£ÄÇIRepositoryÖеÄÄÇЩ¸üÐÂÀà·½·¨·ÅÔÚÁìÓò²ãÊDz»ÊǾͶàÓàÁËÄØ£¿ ±Ï¾¹ÎÒÃÇÏÖÔÚÖ»ÐèÒªÓõ½²éѯµÄ¹¦ÄÜ¡£ÎÒÃÇ¿ÉÒÔµ¥¶À½¨Ò»¸öIQueryµÄ½Ó¿Ú¸øÁìÓò²ãʹÓá£

// IQuery.cs

namespace RepositoryAndEf.Core.Data
{
    public interface IQuery
    {
        T GetById(Guid id);
        IQueryable Table { get; }
    }
}

// IRepository.cs

namespace RepositoryAndEf.Core.Data
{
    public partial interface IRepository:
        IQuery where T : BaseEntity
    {
        bool Insert(T entity);
        bool Update(T entity);
        bool Delete(T entity);
    }
}

ÎÒÃÇÖ±½ÓÈÃIRepository¼Ì³ÐÁËIQuery£¬IQuery¾ÍÏ൱ÓÚIRepositoryµÄÒ»¸ö¹¦ÄÜ×Ó¼¯£¬Ö»Ìṩ¶ÁµÄ¹¦ÄÜ¡£ ¶øÔÚEfRepositoryÖУ¬ÎÒÃÇÖ»Òª±©Â¶DbSet<T>.AsQueryAble()¾Í¿ÉÒÔÁË¡£

// EfRepository IQueryµÄʵÌ岿·Ö

public T GetById(Guid id)
{
    return _context.Set().Find(id);
}

public IQueryable Table
{
    get
    {
        return _context.Set().AsQueryable();
    }
}

// ÁìÓò²ã UserService.cs

namespace RepositoryAndEf.Domain
{
    public class UserService
    {
        private IQuery _userQuery;

        public UserService(IQuery userQuery)
        {
            _userQuery = userQuery;
        }

        public virtual User Register(string email, string name, string password)
        {
            if (_userQuery.Table.Any(u => u.Email == email))
            {
                throw new ArgumentException("The email is already taken");
            }

            var user = new User
            {
                Id = Guid.NewGuid(),
                Email = email,
                Name = name,
                Password = password
            };

            user.CreateShoppingCart();
            return user;
        }
    }
}

// ¿Í»§¶Ëµ÷ÓÃÓ¦ÓòãService´úÂë

namespace RepositoryAndEf.Domain
{
    public class UserService
    {
        private IQuery _userQuery;

        public UserService(IQuery userQuery)
        {
            _userQuery = userQuery;
        }

        public virtual User Register(string email, string name, string password)
        {
            if (_userQuery.Table.Any(u => u.Email == email))
            {
                throw new ArgumentException("The email is already taken");
            }

            var user = new User
            {
                Id = Guid.NewGuid(),
                Email = email,
                Name = name,
                Password = password
            };

            user.CreateShoppingCart();
            return user;
        }
    }
}

ÏÖÔÚ£¬¿ÖÅÂÄãÔÙÏëÔÚÁìÓòÄ£ÐÍÀïÃæÈ¥Ê¹ÓÃRepositoryµÄ¸üÐÂÀà²Ù×÷Ò²²»ÐÐÁ˰ɡ£ Table×÷ΪIQueryable·µ»Ø£¬ÄÇÎÒÃÇÏëÔõô²é¾ÍËæÒâÁË¡£ÒòΪÊÇIQueryable£¬ËùÒÔÒ²ÊÇÖ»»á·µ»ØÎÒÃÇËù²éѯµÄÄÚÈÝ£¬ºÍÖ±½ÓÓÃEF²éѯÊÇÒ»¸öµÀÀí¡£ÏÂÃæÊÇÎÒÃÇ_userQuery.Table.Any()ËùÉú³ÉµÄSQLÓï¾ä¡£

var uow = new RepositoryAndEfContext("ConnStr");
var userRepository = new EfRepository(uow);
var userService = new UserService(uow, userRepository);
var newUser = userService.Register(
    "hellojesseliu@outlook.com", 
    "Jesse Liu", 
    "jesseliu");

¿ÉÓпÉÎÞµÄRepository

ÎÒÃǰÑIRepositoryÒÆ³öÁìÓò²ãÖ®ºó£¬ÔÙ¼ÓÉÏÎÒÃǶÔÑó´Ð¼Ü¹¹µÄÀí½â¡£ÎÒÃǾͿÉÒÔÖªµÀRepositoryÔÚÓ¦ÓòãÒѾ­¿ÉÒÔ±»Ìæ»»³É±ðµÄ¶«Î÷£¬IDALÒ²¿ÉÒÔ°¡:)¡£µ±È»ÓÐÈËÒ²Ðí»á½¨ÒéÖ±½ÓÄÃEFÀ´ÓöàºÃ£¬ÆäʵÎÒ²»½¨ÒéÕâÑùÈ¥×ö£¬¿¼Âǵ½ÒÔºó°ÑEF»»µôµÄ¿ÉÄÜÐÔ¡£²¢ÇÒÎÒÃǼÓÕâÑùÒ»¸ö½Ó¿ÚÕæµÄ²»»á°­×ÅÎÒÃÇʲôÊ¡£Èç¹ûÓÐÈ˾õµÃÔÚ¶ÁÈ¡Êý¾ÝµÄʱºò¼ÓÒ»¸öRepositoryÔÚÖм䣬ÉÙµôÁ˺ܶàEFÌṩµÄ¹¦ÄÜ£¬¾õµÃºÜ²»Ë¬£¬µ¹ÊÇ¿ÉÒÔÊÔÊÔÏñÎÒÃǵÄIQuery½Ó¿ÚÒ»ÑùÖ±½Ó¶ÔDbSetÀ´²éѯ¡£ÎÒÃÇÉõÖÁ¿ÉÒÔѧϰCQRS¼Ü¹¹£¬½«¡°¶Á¡±µÄ·þÎñÍêÈ«·ÖÀ뿪£¬ÎÒÃǾͿÉÒÔµ¥¶ÀÕë¶Ô¡°¶Á¡±À´¶ÀÁ¢Éè¼Æ¡£

µ«ÊÇRepository¸øÎÒÃÇ´øÀ´µÄÓŵ㣬ÕâЩÓŵãÒ²ÊÇÎÒÃDz»ÄÜÇáÒ×¶ªµôËüµÄÔ­Òò£º

1.Ìṩһ¸ö¼òµ¥µÄÄ£ÐÍ£¬À´»ñÈ¡³Ö¾Ã¶ÔÏó²¢¹ÜÀíÆÚÉúÃüÖÜÆÚ

2.°ÑÓ¦ÓúÍÁìÓòÉè¼Æ´Ó³Ö¾Ã¼¼Êõ¡¢¶àÖÖÊý¾Ý¿â²ßÂÔ½âñî³öÀ´

3.ÈÝÒ×±»Ìæ»»³ÉÑÆÊµÏÖ£¨Mock)ÒÔ±ãÎÒÃÇÔÚ²âÊÔÖÐʹÓÃ

Èç¹ûÄãµÄÏîÄ¿ÊôÓÚ¶ÌÆÚµÄÏîÄ¿£¬»òÕß˵Äã²»Óÿ¼ÂǸü»»Êý¾Ý·ÃÎʲ㣬ÄÇôÄã¾Í¿ÉÒÔºöÂÔµÚÒ»ºÍµÚ¶þ¸öÓŵ㡣¶øµÚÈý¸öÓŵ㣬½èÖúÓÚһЩ²âÊÔ¿ò¼ÜÎÒÃÇÒ²¿ÉÒÔʵÏÖ£¬ËùÒÔÈç¹ûÄã²»ÏëÓÃRepository£¬ÄǾͲ»Óã¬Ç°ÌáÌõ¼þÊÇÄãËù×öµÄÏîÄ¿ÔÊÐíÄãÕâÑù×ö£¬²¢ÇÒÄãÒ²Äܹ»ÕÒµ½ºÃµÄÌæ´ú·½°¸À´ÃÖ²¹RepositoryµÄÓÅÊÆ¡£±ÈÈç˵¶ÔÑó´Ð¼Ü¹¹ÖеÄIDALÔÙ½øÐÐһЩ¸ÄÔìµÈµÈ¡£¹ØÓÚ¸ü¶àµ¥Ôª²âÊԵϰÌ⣬ÎÒÃǽ«ÔÚÏÂһƪÖÐÒ»ÆðÀ´Ì½ÌÖ¡£Èç¹û´ó¼Ò¶ÔRepositoryÓÐʲôÆäËüµÄ¿´·¨£¬Ò²»¶Ó­Ò»Æð²ÎÓëÌÖÂÛ¡£

   
6346 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

ÆóÒµ¼Ü¹¹¡¢TOGAFÓëArchiMate¸ÅÀÀ
¼Ü¹¹Ê¦Ö®Â·-ÈçºÎ×öºÃÒµÎñ½¨Ä££¿
´óÐÍÍøÕ¾µçÉÌÍøÕ¾¼Ü¹¹°¸ÀýºÍ¼¼Êõ¼Ü¹¹µÄʾÀý
ÍêÕûµÄArchimateÊÓµãÖ¸ÄÏ£¨°üÀ¨Ê¾Àý£©
Ïà¹ØÎĵµ

Êý¾ÝÖÐ̨¼¼Êõ¼Ü¹¹·½·¨ÂÛÓëʵ¼ù
ÊÊÓÃArchiMate¡¢EA ºÍ iSpace½øÐÐÆóÒµ¼Ü¹¹½¨Ä£
ZachmanÆóÒµ¼Ü¹¹¿ò¼Ü¼ò½é
ÆóÒµ¼Ü¹¹ÈÃSOAÂ䵨
Ïà¹Ø¿Î³Ì

ÔÆÆ½Ì¨Óë΢·þÎñ¼Ü¹¹Éè¼Æ
ÖÐ̨սÂÔ¡¢ÖÐ̨½¨ÉèÓëÊý×ÖÉÌÒµ
ÒÚ¼¶Óû§¸ß²¢·¢¡¢¸ß¿ÉÓÃϵͳ¼Ü¹¹
¸ß¿ÉÓ÷ֲ¼Ê½¼Ü¹¹Éè¼ÆÓëʵ¼ù
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

ר¼ÒÊӽǿ´ITÓë¼Ü¹¹
Èí¼þ¼Ü¹¹Éè¼Æ
ÃæÏò·þÎñÌåϵ¼Ü¹¹ºÍÒµÎñ×é¼þ
ÈËÈËÍøÒÆ¶¯¿ª·¢¼Ü¹¹
¼Ü¹¹¸¯»¯Ö®ÃÕ
̸ƽ̨¼´·þÎñPaaS


ÃæÏòÓ¦Óõļܹ¹Éè¼ÆÊµ¼ù
µ¥Ôª²âÊÔ+ÖØ¹¹+Éè¼ÆÄ£Ê½
Èí¼þ¼Ü¹¹Ê¦¡ª¸ß¼¶Êµ¼ù
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ¡ª¸ß¼¶Êµ¼ù
SOAÌåϵ½á¹¹Êµ¼ù


Èñ°²¿Æ¼¼ Èí¼þ¼Ü¹¹Éè¼Æ·½·¨
³É¶¼ ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
ÉϺ£Æû³µ ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
±±¾© Èí¼þ¼Ü¹¹Éè¼Æ
ÉϺ£ Èí¼þ¼Ü¹¹Éè¼Æ°¸ÀýÓëʵ¼ù
±±¾© ¼Ü¹¹Éè¼Æ·½·¨°¸ÀýÓëʵ¼ù
ÉîÛÚ ¼Ü¹¹Éè¼Æ·½·¨°¸ÀýÓëʵ¼ù
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ¡ª¸ß¼¶Êµ¼ù