در Solution تعدادی پروژه تعریف کردم که با معرفی هر کدام، کدهای هر بخش را هم جهت رفع ابهام قرار میدم.
پروژه cesEntities: این پروژه شامل کلاس های Entity هستش:
public partial class tblCompany
{
[Key]
public int fldId { get; set; }
public string fldNameLan1 { get; set; }
public string fldNameLan2 { get; set; }
public string fldCode { get; set; }
public string fldTel { get; set; }
public string fldFax { get; set; }
public string fldEmail { get; set; }
}
پروژه cesIRepository: شامل کلاس های Interface جهت تعریف متدهای مورد نظر می باشد:
public interface ICompany : IBaseMethods<cesEntities.Models.cesProject.tblComp any>
{
}
کلاس ICompany از IBaseMethods ارث بری کرده که این کلاس هم فهرست متدهای مشترک هستش که هر کلاس اون رو ارث بری کنه می بایست متدهای اون رو پیاده سازی کنه که شامل متدهای Add, Remove و ... میباشد.
در همین پروژه IUnitOfWork هم بصورت زیر تعریف شده:
public partial interface IUnitOfWork
{
public cesProject.ICompany tblCompany { get; }
}
پروژه cesRepository: این پروژه شامل کلاس هایی هستش که تمام متدهای کلاس های Interface متناظر در IRepository را پیاده سازی کرده:
public class tblCompany : cesIRepositories.cesProject.ICompany
{
private cesContexts.cesContext db;
public tblCompany(cesContexts.cesContext context)
{
db = context;
}
public bool Add(cesEntities.Models.cesProject.tblCompany model)
{
if (!db.tblCompany.Any(c => c.fldNameLan1 == model.fldNameLan1))
{
db.tblCompany.Add(model);
return true;
}
return false;
}
}
در زمان نمونه سازی از کلاسهای موجود در Repository باید context مورد نظر به عنوان پارامتر مقداردهی شود. همچنین کلاس UnitOfWork در پروژه cesRepository بصورت زیر پیاده سازی شده:
public sealed class UnitOfWork : IUnitOfWork
{
private readonly cesContexts.cesContext db;
public UnitOfWork(cesContexts.cesContext context)
{
db = context;
}
private readonly cesProject.tblCompany _tblCompany;
public ICompany tblCompany => _tblCompany ?? new cesProject.tblCompany(db);
}
پروژه Asp.NET Core: این پروژه استفاده کننده از context هستش و در service برنامه بصورت زیر تزریق شده است:
builder.Services.AddDbContext<cesContexts.cesConte xt>(options =>
{
options.UseSqlServer(builder.Configuration.GetConn ectionString("DefaultConnection"));
});
builder.Services.AddTransient<cesIRepositories.IUn itOfWork, cesRepositories.UnitOfWork>();
خب در این مرحله در Controllerهای برنامه براحتی میتونم از UnitOfWork استفاده کنم و برنامه هم بدرستی داره کار میکنه. ولی با توجه به موضوعاتی که در پست های قبلی مطرح شد ممنون میشم راهنمایی کنید که اگر قرار باشه لایه جدید با نام Service اضافه بشه که به نوعی Logic برنامه را انجام بده باید کجا و به چه صورتی اضافه بشه. تشکر