참고 : HTTPS : //www.cnblogs.com/tuousi99/p/4455573.html
시스템을 사용하여;
System.Data을 사용함;
네임 스페이스 Manjinba.Dynamics.Domain.Interfaces
{
/// <요약>
///
/// </ 요약>
공용 인터페이스 IBaseDbContext :는 IDisposable
{
/// <요약>
///
/// </ 요약>
IDbConnection을 리더 { 도망; }
/// <요약>
///
/// </ 요약>
IDbConnection을 작가 {얻을; }
/// <요약>
///
/// </ 요약>
공극 InitConnection ();
}
}
Manjinba.Dynamics.Domain.Interfaces을 사용함;
Microsoft.Extensions.Configuration을 사용함;
Microsoft.Extensions.Hosting을 사용함;
System.Configuration을 사용함;
System.Data을 사용함;
System.Data.Common의을 사용함;
Oracle.ManagedDataAccess.Client을 사용함;
네임 스페이스 Manjinba.Dynamics.Infrastructure.Data.Context
{
/// <요약>
///
/// </ 요약>
공용 클래스 BaseDbContext : DisposableObject, IBaseDbContext
{
# 지역 필드
사설 읽기 전용 IHostingEnvironment의 _env;
판독 전용의 전용 ConnectionStringSettings _readerConnectString = NULL;
판독 전용의 전용 ConnectionStringSettings _writerConnectString = NULL;
#endregion
# 지역 속성
공공 IDbConnection을 리더 {개인 설정; 도망; }
공공 IDbConnection을 작가 {개인 설정; 도망; }
#endregion
# 지역 방법
/// <요약>
///
/// </ 요약>
/// <PARAM NAME = "ENV"> </ PARAM>
공중 BaseDbContext (IHostingEnvironment의 ENV)
{
_env = ENV;
// 응용 프로그램 설정에서 구성 얻을
) var에 설정 = 새 ConfigurationBuilder을 (
.SetBasePath (_env.ContentRootPath)
.AddJsonFile ( "appsettings.json")
.Build ();
// 사용할 데이터베이스 정의
(config.GetConnectionString ( "DynConnectionString_Reader"), "Oracle.ManagedDataAccess.Client" "DynConnectionString_Reader") _readerConnectString = 새로운 ConnectionStringSettings을;
_writerConnectString = 새로운 ConnectionStringSettings ( "DynConnectionString_Writer"config.GetConnectionString ( "DynConnectionString_Writer"), "Oracle.ManagedDataAccess.Client");
InitConnection ();
}
/// <요약>
///
/// </ 요약>
공개 무효 InitConnection ()
{
경우 (리더 == NULL)
리더 = 새로운 OracleConnection (_readerConnectString.ConnectionString);
경우 (라이터 == NULL)
라이터 = 새로운 OracleConnection (_writerConnectString.ConnectionString);
// DbProviderFactory dbReaderFactory = DbProviderFactories.GetFactory (this._readerConnectString.ProviderName);
// DbProviderFactory dbWriterFactory = DbProviderFactories.GetFactory (this._writerConnectString.ProviderName);
//this.Reader dbReaderFactory.CreateConnection = ();
//this.Reader dbWriterFactory.CreateConnection = ();
// 경우 (리더 = 널!) this.Reader.ConnectionString = this._readerConnectString.ConnectionString;
// 만약 (! 작가 = NULL) this.Writer.ConnectionString = this._writerConnectString.ConnectionString;
}
/// <요약>
///
/// </ 요약>
/// <PARAM NAME = "isDispose"> </ PARAM>
보호 재정의 무효 처분 (부울 isDispose)
{
경우 (이 isDispose!)
{
반환;
}
경우 (this.Writer.State == ConnectionState.Open)
this.Writer.Close ();
경우 (this.Writer.State == ConnectionState.Open)
this.Writer.Dispose ();
}
#endregion
}
}
Manjinba.Dynamics.Domain.Core.Models을 사용함;
시스템을 사용하여;
System.Collections.Generic을 사용함;
System.Data을 사용함;
네임 스페이스 Manjinba.Dynamics.Domain.Interfaces
{
/// <요약>
///
/// </ 요약>
공용 인터페이스의 IUnitOfWork :는 IDisposable
{
/// <요약>
///
/// </ 요약>
부울 최선을 다하고 { 세트; 도망; }
/// <요약>
///数据库执行错误码
/// </ 요약>
은 IList <INT> ErrorCode가 {얻을; 세트; }
/// <요약>
///
/// </ 요약>
IDbTransaction 트란 {얻을; }
/// <요약>
///
/// </ 요약>
/// <PARAM NAME = "엔티티"> </ PARAM>
/// <PARAM NAME = "콜백"> </ PARAM>
RegisterAdd (IEntity 엔티티 Func을 <INT> 콜백) 무효화;
/// <요약>
///
/// </ 요약>
/// <PARAM NAME = "엔티티"> </ PARAM>
/// <PARAM NAME = "콜백"> </ PARAM>
공극 RegisterUpdate (IEntity 엔티티 Func을 <INT> 콜백);
/// <요약>
///
/// </ 요약>
/// <PARAM NAME = "엔티티"> </ PARAM>
/// <PARAM NAME = "콜백"> </ PARAM>
(IEntity 무효화 RegisterDelete 엔티티 Func을 <INT> 콜);
/// <요약>
///
/// </ 요약>
공극 BeginTran ();
/// <요약>
///
/// </ 요약>
불리언) (커밋
/// <요약>
///
/// </ 요약>
공극 롤백 ();
Manjinba.Dynamics.Domain.Core.Models을 사용함;
Manjinba.Dynamics.Domain.Interfaces을 사용함;
Manjinba.Dynamics.Infrastructure.Data.Context을 사용함;
Oracle.ManagedDataAccess.Client을 사용함;
시스템을 사용하여;
System.Collections.Generic을 사용함;
System.Data을 사용함;
System.Transactions를을 사용함;
Manjinba.Dynamics.Infrastructure.Data.UoW 네임 스페이스
{
/// <요약>
///
/// </ 요약>
공용 클래스의 UnitOfWork : IUnitOfWork
{
# 지역 필드
사설 읽기 전용 IBaseDbContext _dbContext;
/// <요약>
/// 단순히 캐시 저장의 효과를 달성하기 위해 사전 개체 인스턴스를 사용하여 GetRepository 방법은 물론,이 방법은 개선 될 수
/// 게으른 로딩 또는 안전 사전 스레드
</ 요약> ///
개인 사전 = 새로운 새로운 repositoryCache <유형은 객체> 사전 <유형, 개체> ();
개인 사전 <IEntity, Func을 <INT >> addEntities,
개인 사전 <IEntity, Func을 <INT >> updateEntities,
개인 사전 <IEntity, Func을 <INT >> deleteEntities,
true로 개인 = BOOL _committed ;
전용 판독 전용 오브젝트 _sync = 새로운 객체 ();
공공 IDbTransaction 트란 {개인 설정; 도망; }
#endregion
# 지역 속성
공공 부울은 최선을 다하고
{
세트 {_committed = 값; }
얻을 {_committed를 반환; }
}
/// <요약>
에러 코드를 수행 할 /// 데이터베이스
/// </ 요약>
공공 IList의 <INT>는 ErrorCode가 {GET, SET을}
#endregion을
# 지역 방법
/// <요약>
///
/// </ 요약>
/// <PARAM NAME = "dbContext"> </ PARAM>
공공의 UnitOfWork (IBaseDbContext dbContext)
{
_dbContext = dbContext;
addEntities = 새로운 사전 <IEntity, Func을 <INT >> ();
updateEntities = 새로운 사전 <IEntity, Func을 <INT >> ();
deleteEntities = 새로운 사전 <IEntity, Func을 <INT >> ();
ErrorCode가 = 새로운 목록 <INT> ();
//this.Committed = 거짓;
BeginTran ();
}
/// <요약>
///
/// </ 요약>
/// <PARAM NAME = "엔티티"> </ PARAM>
/// <PARAM NAME = "콜백"> </ PARAM>
addEntities.Add (엔티티 콜);
}
/// <요약>
///
/// </ 요약>
/// <PARAM NAME = "엔티티"> </ PARAM>
/// <PARAM NAME = "콜백"> </ PARAM>
공개 무효를 RegisterUpdate (IEntity 엔티티 Func을 <INT> 콜백)
{
updateEntities.Add (엔티티 콜);
}
/// <요약>
///
/// </ 요약>
/// <PARAM NAME = "엔티티"> </ PARAM>
/// <PARAM NAME = "콜백"> </ PARAM>
공개 무효를 RegisterDelete (IEntity 엔티티 Func을 <INT> 콜백)
{
deleteEntities.Add (엔티티 콜);
}
/// <요약>
_dbContext.Writer.Open ();
this.Tran = ((OracleConnection) _dbContext.Writer) .BeginTransaction (System.Data.IsolationLevel.ReadCommitted);
this.Committed = 거짓;
}
/// <요약>
///
/// </ 요약>
공중 커밋 불리언 ()
{
var에 addCnt = 0;
VAR의 updCnt = 0;
VAR의 delCnt = 0;
foreach는 (addEntities.Keys VAR의 엔티티)
{
VAR) (= addEntities의 [기업]을 추가;
경우 (추가> 0)
addCnt + = 추가;
다른
ErrorCode.Add (추가)
}
의 foreach (updateEntities.Keys VAR의 엔티티)
{
var에 UPD = updateEntities [기업] ();
만약 UPD (> 0)
updCnt + = UPD;
그밖에
ErrorCode.Add (UPD);
}
의 foreach (deleteEntities.Keys VAR의 엔티티)
{
VAR = 델 deleteEntities [기업] ();
경우 (DEL> 0)
delCnt + = 델;
다른
ErrorCode.Add (델);
}
(addCnt == addEntities.Count && updCnt == updateEntities.Count && delCnt == deleteEntities.Count가 있으면)
{
= TRUE 커미트;
this.Tran.Commit ();
true를 반환;
}
로크 (_sync)
{
this.Tran.Rollback ();
this._committed = TRUE;
false를 반환;
}
}
/// <요약>
///
/// </ 요약>
공개 무효 롤백 ()
{
경우 (커미트) 창;
(_sync) 잠금
{
) (this.Tran.Rollback 단계;
this._committed = TRUE;
}
}
/// <요약>
///
/// </ 요약>
공개 무효 폐기 ()
{
this.repositoryCache.Clear ();
_dbContext.Dispose ();
}
#endregion
}
}