2013-01-04 2 views
1

PetaPoco를 사용하여 ASP.NET 웹 양식 프로젝트 용 DAL 레이어를 생성하려고합니다.DAL 레이어에서 PetaPoco를 사용하는 올바른 방법 (ASP.NET Web Forms VB.NET)

Namespace Eva.Dal.Polls 
Public Partial Class EVAMOD_PL_CategoryDb 
    Private db As Eva.Dal.Core.EvaDb 

    Public Function Insert(a As EVAMOD_PL_Category) As Object 
     Return db.Insert(a) 
    End Function 

    Public Sub New() 
     db = New Eva.Dal.Core.EvaDb 
    End Sub 
End Class 

Public Partial Class EVAMOD_PL_GL_CategoryDb 
    Private db As Eva.Dal.Core.EvaDb 

    Public Function Insert(a As EVAMOD_PL_GL_Category) As Object 
     Return db.Insert(a) 
    End Function 

    Public Sub New() 
     db = New Eva.Dal.Core.EvaDb 
    End Sub 
End Class 
End Namespace 

특히 DB를 여는 방법에 관심이 있습니다. PetaPoco 사이트에서 는

// Create a PetaPoco database 
objectvar db=new PetaPoco.Database("connectionStringName"); 
// Show all articles  
foreach (var a in db.Query<article>("SELECT * FROM articles")){ 
    Console.WriteLine("{0} - {1}", a.article_id, a.title); 
} 

는하지만 PetaPoco와 함께 제공되는 T4 발생기에 좋은 섹션 느릅 나무 모든 DTO들과 함께,가,

같은 것을 생성
Namespace Eva.Dal.Core 
Public Partial Class EvaDb 
    Inherits Database 

    Public Sub New() 
     MyBase.New("ConnectionString") 
     CommonConstruct() 
    End Sub 

    Public Sub New(connectionStringName As String) 
     MyBase.New(connectionStringName) 
     CommonConstruct() 
    End Sub 

    Private Partial Sub CommonConstruct() 
    End Sub 

    Public Interface IFactory 
     Function GetInstance() As EvaDb 
    End Interface 

    Public Shared Property Factory() As IFactory 
     Get 
      Return mFactory 
     End Get 
     Set 
      mFactory = Value 
     End Set 
    End Property 

    Private Shared mFactory As IFactory 

    Public Shared Function GetInstance() As EvaDb 
     If istance IsNot Nothing Then 
      Return istance 
     End If 

     If Factory IsNot Nothing Then 
      Return Factory.GetInstance() 
     Else 
      Return New EvaDb 
     End If 
    End Function 

    <ThreadStatic> _ 
    Shared istance As EvaDb 

    Public Overrides Sub OnBeginTransaction() 
     If istance Is Nothing Then 
      istance = Me 
     End If 
    End Sub 

    Public Overrides Sub OnEndTransaction() 
     If istance Is Me Then 
      istance = Nothing 
     End If 
    End Sub 

    Public Class Record(Of T As New) 
     Public Shared ReadOnly Property Repo() As EvaDb 
      Get 
       Return EvaDb.GetInstance() 
      End Get 
     End Property 
     Public Function IsNew() As Boolean 
      Return Repo.IsNew(Me) 
     End Function 

     ....... 

    End Class 
End Class 
End Namespace 

그래서 느릅 나무는 IS 예제가있다 내 DB 개체를 만들고 PetaPoco로 DAL 계층에서 사용하는 올바른 방법?

또한 PetaPoco를 사용하여 연결을 열린 상태로 유지하고 재사용 할 수있는 방법이 있다는 것을 읽었습니다. BLL/DAL 아키텍처에서는 실현 불가능할 것입니다. 예를 들어 BLL에서 2-3 번 작업을하면 DB에 액세스 할 수 있습니다. ? 아니면 그렇다면 제대로 처리해야합니까? 연결을 열고 모든 2-3 작업을 수행하는 DAL 메서드를 만드는 중입니까? BLL에서 연결을 열면 안됩니다.

public class DatabaseCreator 
    public shared function GetContext() As EvaDb 
     return new EvaDb(ConfigurationManager.ConnectionStrings("X").ConnectionString) 
    end sub 
end class 

나는 데이터베이스 연결은 당신이 수행하는 즉시 작업에 더 이상 열 유지하지,하지만 그것을 떠나지 않을 것입니다 : 사전에

감사

나는 항상 랩퍼를 작성

답변

5

UPDATE :이 당신이 공유 연결을 사용하는 방법입니다 :

public class SharedConnection : IDisposable 
{ 
    private Database _db; 

    public SharedConnection(Database db) 
    { 
     _db = db; 
     _db.OpenSharedConnection(); 
    } 

    public void Dispose() 
    { 
     _db.CloseSharedConnection(); 
    } 
} 

public class FooBarDao 
{ 
    private Database _db = new Database("conn_str_name"); 

    public SharedConnection GetSharedConnection() 
    { 
     return new SharedConnection(_db); 
    } 

    public Foo GetFoo(string id) 
    { 
     return db.SingleOrDefault<Foo>(
      "SELECT FooVal FROM FooTbl WHERE Id = @0", id); 
    } 

    public Bar GetBar(string id) 
    { 
     return db.SingleOrDefault<Bar>(
      "SELECT BarVal FROM BarTbl WHERE Id = @0", id); 
    } 
} 

public class FooBarManager 
{ 
    private FooBarDao _dao = new FooBarDao; 

    public void GetFooAndBar(string fooId, string barId) 
    { 
     using (_dao.GetSharedConnection()) 
     { 
      _dao.GetFoo(fooId); 
      _dao.GetBar(barId); 
     } 
    } 
} 
+0

매우 감사합니다. – Manight

+0

PetaPoco T4가 PetaPoco Database 클래스에서 상속받은 파생 클래스를 만들고 기본 클래스의 메서드를 복제하는 Record 클래스를 추가하는 이유는 아직도 btw를 이해하지 못합니다. 우리는 기본 PetaPoco Database 클래스를 인스턴스화 할 수 없었습니까? 중첩 된 Record 클래스가 사용 된 파생 클래스는 무엇입니까? 멍청한 질문에 대해 죄송합니다. – Manight

1

그것을 인스턴스화 재사용을 위해 열린 상태. 다중 레이어를 사용하면 응용 프로그램을 구조화하여 비즈니스 구성 요소 (예 : 저장소 패턴)간에 연결을 공유 할 수 있습니다. 각 저장소 메서드에서 연결을 열거 나 참조를 저장소의 생성자에 전달하는 습관을 들었습니다.

+0

난 그냥 연결 문자열없이 새로운 EvaDb을 반환 할 수 없습니다? PetaPoco T4에서 만든 것들을 감안할 때? 그래서 각 요청마다 하나의 DB를 열어서 각 호출을 만들고 파괴하는 것이 가장 좋습니다. 그런 다음 httpcontext 항목을 사용하여 응용 프로그램의 다른 동시 HTTP 요청에서이를 분리하는 현재 요청에 대해 저장하는 것이 더 안전할까요? – Manight

0

브라이언의 제안에 따라와 유래 여기에 다른 사용자의 제안을 읽고, 내가 만들 정적 도우미 함수 느릅 나무 사용을 현재 HttpContext를 만들어 각 요청에 대해 단일 Db 관행을 제공합니다 (또는 기존을 반환). 이 방법 (vb.net) : 내 달 객체의 다음

Public NotInheritable Class DbHelper 
    Public Shared Function GetEvaDbIstance() As Eva.Dal.Core.EvaDb 
     If HttpContext.Current.Items("EvaDb") Is Nothing Then 
      Dim retval = New Eva.Dal.Core.EvaDb 
      HttpContext.Current.Items("EvaDb") = retval 
      Return retval 
     End If 
     Return DirectCast(HttpContext.Current.Items("EvaDb"), Eva.Dal.Core.EvaDb) 
    End Function 

    Private Sub New() 

    End Sub 
    End Class 

나는 단지

Private db As New Eva.Dal.Core.EvaDb = DbHelper.GetEvaDbIstance()