مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

omidjadid

عضویت از 1399/02/05

سوال از unitOfWork

  • یکشنبه 7 اردیبهشت 1399
  • 18:41
تشکر میکنم

سلام استاد بزرگوار شما فرمودید که unitOfWork را میسازیم که دسترسی مسقیم به db و منابع نداشته باشیم خب میتونستیم کار زیر را انجام دهیم، چرا دوباره یه شی دیگه بنام unitOfWork اضافه کنیم؟

namespace Accounting.DataLayer.Services
{
    public class CustomerRepository:ICustomerRepository
    {
        private Accounting_DBEntities db;

        public CustomerRepository()
        {
			if(db!=null)		
            db =new Accounting_DBEntities();
        }
	}
}
و در اجرا هم مشکلی پیش نمیاد:
static void Main(string[] args)
        {
            ICustomerRepository customer=new CustomerRepository();

            
            customer.InsertCustomer(AddCustomer);
            customer.Save();

            var list = customer.GetAllCustomers();
        }

پاسخ های این پرسش

تعداد پاسخ ها : 4 پاسخ
کاربر سایت

omid79550

عضویت از 1398/06/14

  • یکشنبه 7 اردیبهشت 1399
  • 21:19

سلام ..

درسته در این روش دسترسی مستقیم  به  db نداریم ولی ممکنه ما داخل یه فرم به چند تا Repository نیاز داشته باشیم که به ازای هر Repository که میسازیم یک شی از context ما نمونه سازی میشه و باز میمونه 
ولی  UnitOfWork جلوی این کار را میگیره و اگه از context ما از قبل نمونه سازی شده بود , همون را برمیگردونه 

کاربر سایت

omidjadid

عضویت از 1399/02/05

  • دوشنبه 8 اردیبهشت 1399
  • 00:39

سلام اینکه شما فرمودید رو هم میشه به همین کد من اضافه کرد یعنی متد dispose را پیاده سازی مکنیم و بنابراین ایراد شما حل میشه ولی باز سوال من سرجای خودش باقی است و به نظر من UnitOfWork لزومی نداره:

namespace Accounting.DataLayer.Services
{
    public class CustomerRepository:ICustomerRepository,IDisposable
    {
        private Accounting_DBEntities db;

        public CustomerRepository()
        {
			if(db!=null)		
            db =new Accounting_DBEntities();
        }
	}
	public void Dispose()
    {
        db.Dispose();
    }
}

و نحوه پیاده سازی:

static void Main(string[] args)
{
            ICustomerRepository customer=new CustomerRepository();   
            var list = customer.GetAllCustomers();
			db.dispose();
}

و حالا کسی میتونه بگه که متد unitOfWork چه لزومی داره؟؟؟؟؟؟؟؟؟؟؟

کاربر سایت

AmirGhasemi

عضویت از 1392/02/25

  • دوشنبه 8 اردیبهشت 1399
  • 08:35

سلام

کاری که شما در پست اول این تایک کردید یعنی ساختن یک پراپرتی از db  نیز چیزی شبیه به همین پترن UnitOfWork  است البته به صورت خیلی خیلی ضعیف تر.

این پترن، یکی از پترن های استاندارد دنیاست و زمانی کاربرد خود را نشان می دهد که شما معماری چندلایه را در دستور کار خود قرار دهید. من احساس می کنم در سمپل بالا که نوشته اید اصولا معماری چند لایه ندارید و اگر معماری چندلایه نداشته باشید اصلا unitOfWork به کارتون نمیاد.

این پترن گارانیتی می کنه که در هر بار درخواست کلاینت به سرور، فقط یک شی از context  ساخته بشه و دسترسی مستقیم به db  وجود نداره! اما این نحوه نوشتن شما چندین و چند db  ایجاد می کنه. فکرک ن شما می خواهی در کلاس دانشجو یک دانشجو اضافه کنی بعد درس های دانشجو را اضافه کنی و در نهایت نمره هایشان را ثبت کنی! در این نحوه نوشتن شما 3 بار db  ساخته میشه!

کاربر سایت

omidjadid

عضویت از 1399/02/05

  • دوشنبه 8 اردیبهشت 1399
  • 16:25

سلام ممنون ولی سه بار ساخته نمیشود چون یه شرطی گذاشتم که اگر db !=null دوباره شی ای ساخته نشود و در کانستراکتور است که احتمالا ندیدید و این باعث میشود تا db بسته یا همون close نشود و دوباره ساخته نشود تا همه کارتون انجام شود و اون دستور را دوباره در زیر مینویسم 

public CustomerRepository()
        {
            if(db!=null)        
            db =new Accounting_DBEntities();
        }

حالا لطفا اگه چیزی کسی به ذهنش میرسه یه توضیحی بده ؟

کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)