IUnityOfWork~私のIUnity OfWork+Repositoryアーキテクチャを教えてください。
29426 ワード
目次に戻ります
第一に、アイユニティOfWorkを知っています。なぜアイユニティOfWorkインターフェースが現れたのですか?
第二に、Linq to SqlとEnttityFraamewarksの中のSubmtChanges()に何かが起こったのですか?
第三講方法の完全性と統一提出は衝突しません。
第四講DbContectオブジェクトの作成はBLL層に公開すべきです。
第五に、私のIUnityOfWork+Repositoryアーキテクチャについて話します。
このシステムの文章はこの文章を書き終わったら目を引きます。全部で5つのIUnityOfWorkが私達にくれたのは性能、原子化操作などの方法の改善です。以下は私のIUnityOfWork+Repositoryモードを大体話して、コアコードを代用します。
下のインターフェース
これはインターフェース仕様のプロジェクト層で、CURD操作規範とUnityOfWork仕様から構成されています。
以上で、私たちのユニクロシリーズは終わりました。皆さん、おやすみなさい。
目次に戻ります
第一に、アイユニティOfWorkを知っています。なぜアイユニティOfWorkインターフェースが現れたのですか?
第二に、Linq to SqlとEnttityFraamewarksの中のSubmtChanges()に何かが起こったのですか?
第三講方法の完全性と統一提出は衝突しません。
第四講DbContectオブジェクトの作成はBLL層に公開すべきです。
第五に、私のIUnityOfWork+Repositoryアーキテクチャについて話します。
このシステムの文章はこの文章を書き終わったら目を引きます。全部で5つのIUnityOfWorkが私達にくれたのは性能、原子化操作などの方法の改善です。以下は私のIUnityOfWork+Repositoryモードを大体話して、コアコードを代用します。
下のインターフェース
これはインターフェース仕様のプロジェクト層で、CURD操作規範とUnityOfWork仕様から構成されています。
namespace UnitOfWork.Data.Core
{
/// <summary>
///
/// , ,
/// </summary>
public interface IUnitOfWork
{
/// <summary>
/// ,
/// </summary>
void Save();
/// <summary>
/// , repository SaveChanges
/// false,
/// </summary>
/// <returns></returns>
bool IsNotSubmit { get; set; }
}
/// <summary>
///
///
/// </summary>
/// <typeparam name="T"></typeparam>
public interface IUnitOfWork<T> : IUnitOfWork where T : class { }
}
namespace UnitOfWork.Data.Core
{
public interface IRepository<TEntity>
where TEntity : class
{
/// <summary>
///
/// </summary>
/// <param name="item">Item to add to repository</param>
void Insert(TEntity item);
/// <summary>
///
/// ,
/// </summary>
/// <param name="item">Item to delete</param>
void Delete(TEntity item);
/// <summary>
///
/// </summary>
/// <param name="item"></param>
void Update(TEntity item);
/// <summary>
/// Get all elements of type {T} in repository
/// </summary>
/// <returns>List of selected elements</returns>
IQueryable<TEntity> GetModel();
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
TEntity Find(params object[] id);
}
}
namespace UnitOfWork.Data.Core
{
/// <summary>
/// Repository
/// </summary>
public interface IExtensionRepository<TEntity> where TEntity : class
{
/// <summary>
///
/// </summary>
/// <param name="item"></param>
void Insert(IEnumerable<TEntity> item);
/// <summary>
///
/// </summary>
/// <param name="item"></param>
void Update(IEnumerable<TEntity> item);
/// <summary>
///
/// </summary>
/// <param name="item"></param>
void Delete(IEnumerable<TEntity> item);
/// <summary>
/// , EF
/// </summary>
/// <param name="entity"></param>
void Update(System.Linq.Expressions.Expression<Action<TEntity>> entity);
}
}
namespace UnitOfWork.Data.Core
{
/// <summary>
///
/// </summary>
public interface ICompleteRepository<T> :
IRepository<T>,
IExtensionRepository<T>
where T : class
{
}
}
DATA層では、これらのインターフェースを実現する必要があります。EFを例にとって、このようなインターフェースを実現します。namespace EntityFrameworks.Data.Core
{
using UnitOfWork.Data.Core;
using System.Data.Entity.Infrastructure;
public class DbContextRepository<TEntity> :
ICompleteRepository<TEntity> where TEntity : class
{
protected DbContext _db { get; private set; }
IUnitOfWork iUnitWork;
public DbContextRepository(IUnitOfWork db)
{
iUnitWork = db;
_db = (DbContext)db;
}
#region IRepository<T>
public virtual void Insert(TEntity item)
{
_db.Entry<TEntity>(item);
_db.Set<TEntity>().Add(item);
this.SaveChanges();
}
public virtual void Delete(TEntity item)
{
_db.Set<TEntity>().Attach(item);
_db.Set<TEntity>().Remove(item);
this.SaveChanges();
}
public virtual void Update(TEntity item)
{
_db.Set<TEntity>().Attach(item);
_db.Entry(item).State = EntityState.Modified;
this.SaveChanges();
}
public void Update(Expression<Action<TEntity>> entity)
{
TEntity newEntity = typeof(TEntity).GetConstructor(Type.EmptyTypes).Invoke(null) as TEntity;//
List<string> propertyNameList = new List<string>();
MemberInitExpression param = entity.Body as MemberInitExpression;
foreach (var item in param.Bindings)
{
string propertyName = item.Member.Name;
object propertyValue;
var memberAssignment = item as MemberAssignment;
if (memberAssignment.Expression.NodeType == ExpressionType.Constant)
{
propertyValue = (memberAssignment.Expression as ConstantExpression).Value;
}
else
{
propertyValue = Expression.Lambda(memberAssignment.Expression, null).Compile().DynamicInvoke();
}
typeof(TEntity).GetProperty(propertyName).SetValue(newEntity, propertyValue, null);
propertyNameList.Add(propertyName);
}
_db.Set<TEntity>().Attach(newEntity);
_db.Configuration.ValidateOnSaveEnabled = false;
var ObjectStateEntry = ((IObjectContextAdapter)_db).ObjectContext.ObjectStateManager.GetObjectStateEntry(newEntity);
propertyNameList.ForEach(x => ObjectStateEntry.SetModifiedProperty(x.Trim()));
this.SaveChanges();
// ((IObjectContextAdapter)_db).ObjectContext.Detach(newEntity);
}
public IQueryable<TEntity> GetModel()
{
// return _db.Set<TEntity>().AsNoTracking();
return _db.Set<TEntity>();
}
#endregion
#region IExtensionRepository<T>
public virtual void Insert(IEnumerable<TEntity> item)
{
item.ToList().ForEach(i =>
{
this.Insert(i);//
});
}
public virtual void Delete(IEnumerable<TEntity> item)
{
item.ToList().ForEach(i =>
{
this.Delete(i);
});
}
public virtual void Update(IEnumerable<TEntity> item)
{
item.ToList().ForEach(i =>
{
this.Update(i);
});
}
public TEntity Find(params object[] id)
{
return _db.Set<TEntity>().Find(id);
}
#endregion
#region Protected Methods
/// <summary>
/// IsNotSubmit ,
/// , repository , IsNotSubmit true, ,
/// repository , , false, , 。
/// </summary>
protected void SaveChanges()
{
if (!iUnitWork.IsNotSubmit)
iUnitWork.Save();
}
/// <summary>
/// , SaveChange() SQL ,
/// ,
/// tableName:
/// param: 0 ,1 ,2 ,3
/// </summary>
/// <param name="tableName"> </param>
/// <param name="param"> , 0 ,1 ,2 ,3 </param>
protected virtual void UpdateForCount(string tableName, params object[] param)
{
string sql = "update [" + tableName + "] set [{2}]=ISNULL([{2}],0)+{3} where [{0}]={1}";
List<object> listParasm = new List<object>
{
param[0],
param[1],
param[2],
param[3],
};
_db.Database.ExecuteSqlCommand(string.Format(sql, listParasm.ToArray()));
}
#endregion
}
}
Entityエンティティモデル層では、IUnityOfWorkというインターフェースを継承し、それを実現する必要があります。 public partial class backgroundEntities : IUnitOfWork
{
#region IUnitOfWork
public void Save()
{
this.SaveChanges();
}
public bool IsNotSubmit
{
get;
set;
}
#endregion
}
最後にBLL階で業務の構成と基礎操作の実現を完成します。namespace BLL
{
public abstract class BLLBase
{
protected IUnitOfWork IUnitOfWork { get; private set; }
public BLLBase()
: this(null)
{
}
public BLLBase(IUnitOfWork iUnitOfWork)
{
IUnitOfWork = iUnitOfWork;
}
protected ICompleteRepository<T> LoadRepository<T>() where T : class
{
return IUnitOfWork == null ? new TestBase<T>() : new TestBase<T>(IUnitOfWork);
}
}
}
BLL層の特定のサービスの実現において、BLLBaseを継承し、データコンテキストをパラメータとして渡す。 public class OrderManager : BLLBase
{
public OrderManager()
: base(new TestDataContext())
{
}
public void GeneratorOrder(Order_Info order)
{
GeneratorOrder(order, null);
}
public void GeneratorOrder(Order_Info order, Product product)
{
#region BLLBase
IUnitOfWork.IsNotSubmit = true;
new OrderRepository(IUnitOfWork).Insert(order);//DAL Repository
if (product != null)
LoadRepository<Product>().Insert(product);//BLLBase CURD
IUnitOfWork.SaveChanges();
#endregion
}
}
WEB階でBLLの具体的な業務を直接呼び出してください。以上で、私たちのユニクロシリーズは終わりました。皆さん、おやすみなさい。
目次に戻ります