¸ÅÊö
ÉÏһƪÎÒÃÇËãÊÇ´ÖÂԵĽéÉÜÁËÒ»ÏÂ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ÓÐʲôÆäËüµÄ¿´·¨£¬Ò²»¶ÓÒ»Æð²ÎÓëÌÖÂÛ¡£
|