Data - Veri Erişim Katmanı

Açıklama

Bu belge veri erişim katmanı işlemlerini tanımlar. Veri erişim katmanı Veritabanı, Servis ve diğer veri kaynaklarına erişim için kullanılan katmandır.Bu katmanda:

  • İş mantığı bulunmaz. (Sadece veri alma-verme işlemleri yapılır.)

  • Veri istemcileri arayüzler üzerinden çalışır ve birim testleri oluşturulur.

Veritabanı Erişimi

Repository metotları

Repository metotları temel olarak aşağıdaki adımlardan oluşur:

  1. İstek bilgilerinin oluşturulması

  2. Varsayılan dönüş değerinin tanımlanması

  3. Veritabanı isteğinin yapılması ve sonucun döndürülmesi

Örnek:

public bool UpdatePost(int postId, int memberId)
{
    var dataRequest = dataRequestFactory.UpdatePost(postId, memberId);
    var defaultReturnValue = false;

    return dataClient.GetScalar<bool>(dataRequest, defaultReturnValue);
}

DataRequest

Veritabanı işlemi istek bilgileri IDataRequestFactory aracılığıyla oluşturulur. Bu sınıfta istek bilgilerini içeren özel bir metot oluşturulur.

Dikkat edilecek konular:

  1. Metot, çağrılacak prosedür ile aynı isme sahip olur.

  2. Prosedür isimleri ProcedureNames sınıfında özellik olarak tanımlanır.

  3. Parametre isimleri ParameterNames sınıfında özellik olarak tanımlanır.

Vertabanı isteği oluşturma örneği:

public DataRequest UpdatePost(int postId, int memberId)
{
    string procedureName = ProcedureNames.UpdatePost;
    var parameters = new DynamicParameters();
    parameters.Add(ParameterNames.PostId, postId);
    parameters.Add(ParameterNames.MemberId, memberId);

    return new DapperDataRequest
    {
        ProcedureName = procedureName,
        Parameters = parameters
    };
}

OUTPUT tipinde parametre kullanan bir örnek:

public int AddPost(Post post)
{
    var dataRequest = dataRequestFactory.AddPost(post);
    var defaultReturnValue = false;

    bool isSuccess = dataClient.GetScalar<bool>(dataRequest, defaultReturnValue);

    if (!isSuccess)
    {
        return 0;
    }

    return dataRequest.Parameters.Get<int>(ParameterNames.PostId);
}

Bu metot için veri isteği aşağıdaki gibi oluşturulur:

public DataRequest AddPost(Post post)
{
    string procedureName = ProcedureNames.AddPost;
    var parameters = new DynamicParameters();
    parameters.Add(ParameterNames.PostSecureId, post.PostSecureId);
    parameters.Add(ParameterNames.MemberId, post.MemberId);
    parameters.Add(ParameterNames.PostTypeId, post.PostType.ToInt32());
    parameters.Add(ParameterNames.PostId, 0, DbType.Int32, ParameterDirection.Output, sizeof(int));

    return new DapperDataRequest
    {
        ProcedureName = procedureName,
        Parameters = parameters
    };
}

SplitOn içeren veri isteği örneği:

Sorgu sonucu dönen alanlar belli nesnelere göre gruplanarak alt sınıflar doldurulacaksa, ilgili nesnenin alanlarını döndüren alanlar belirtilir.

public DataRequest GetProfileInfo(int memberId)
{
    string procedureName = ProcedureNames.GetProfileInfo;
    var parameters = new DynamicParameters();
    parameters.Add(ParameterNames.MemberId, memberId);

    return new DapperDataRequest
    {
        ProcedureName = procedureName,
        Parameters = parameters,
        SplitOnParameters = GetSplitOnParameters(ColumnNames.OccupationId, ColumnNames.EducationId)
    };
}

string GetSplitOnParameters(params string[] fieldNames)
{
    return string.Join(",", fieldNames);
}

Bu istek bilgilerini kullanan repository metodu aşağıda gösterilmiştir. GetItem metodu çağrılırken belirtilen ilk 3 tip (ProfileInfo, Occupation, Education) sorgunun ayrılacağı parçaları, son tip (ProfileInfo) dönüş tipini belirler.

public ProfileInfo GetProfileInfo(int memberId)
{
    var dataRequest = dataRequestFactory.GetProfileInfo(memberId);
    ProfileInfo defaultValue = null;

    return dataClient.GetItem<ProfileInfo, Occupation, Education, ProfileInfo>(
        dataRequest,
        (profileInfo, occupation, education) =>
        {
            profileInfo.Education = education;
            profileInfo.Occupation = occupation;
            return profileInfo;
        },
        dataRequest.SplitOnParameters,
        defaultValue);
}

Varsayılan değerler

Veritabanı isteği başarısız olursa ya da döndürülecek bir kayıt bulunamazsa hangi sonucun döndürüleceği Repository metodunda yapılan çağrıda belirtilir.

bool tipinde dönüş değeri için varsayılan:

var defaultReturnValue = false;

int ve sayısal dönüş değerleri için varsayılan:

var defaultReturnValue = 0;

string tipinde dönüş değeri için varsayılan:

string defaultReturnValue = null;

Sınıf tipinde dönüş değerleri için varsayılan:

Post defaultReturnValue = null;

Özel durum için dönüş tipleri IDefaultValueFactory sınıfında tanımlanır.

public PasswordActivation CreateDefaultPasswordActivation()
{
    return new PasswordActivation { IsActive = false };
}

Liste dönüş tipleri için varsayılan olarak boş liste döndürülür:

var defaultValue = new List<Member>();

Servis Erişimi

Servislere erişen Repository metotları temel olarak aşağıdaki adımlardan oluşur:

  1. İstek bilgilerinin oluşturulması

  2. İstek sonucunun uygun tipe çevrilmesi ve döndürülmesi

  3. Hata kontrolü

Veritabanı istemcisi yerine Api istemcisi kullanılır. Diğer yönleriyle Veritabanı erişimi gibi tasarlanır ve kullanılır.

Last updated

Was this helpful?