在 .NET 6 中哪里可以注册工作单元服务?

Onu*_*ker 2 c# .net-core asp.net-core .net-6.0

我想知道如何在.NET 6 中注册unitofwork 服务。

在以前版本的.NET Core 中,可以在startup.cs 文件中注册unitofwork 服务,如下所示。

services.AddTransient<IUnitOfWork, UnitOfWork>();
Run Code Online (Sandbox Code Playgroud)

在.NET 6中,startup.cs和program.cs文件被合并。

是否可以在program.cs中注册服务?如果可以的话,怎么办?

Md *_*ron 12

\n

让我们从您的问题开始

\n
\n

"Is it possible to register the service in program.cs?"

\n
\n

是的,绝对可以service在 中注册program.cs

\n
\n

"If possible, then how?"

\n
\n

这是Program.cs为您提供的示例asp.net 6

\n
\n
var builder = WebApplication.CreateBuilder(args);\n\n// Add services to the container.\n\nbuilder.Services.AddScoped<IUnitOfWork, UnitOfWork>();\n
Run Code Online (Sandbox Code Playgroud)\n
\n

Note:

\n

它\xe2\x80\x99s 几乎与我们在startup.cs 文件中使用的\nasp.net core 3.2类似。asp.net 5同样的事情需要在asp.net 6 program.cs文件中做,只是方式有点不同。

\n
\n

如果您需要完整的示例,asp.net 6您可以查看以下详细答案:

\n

Model:

\n

我会使用User模型来构建UnitOfWork示例dotnet 6

\n
public class User\n    {\n        public Guid Id { get; set; }\n        public string FirstName { get; set; }\n        public string LastName { get; set; }\n        public string Email { get; set; }\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

ApplicationDbContext:

\n
public class ApplicationDbContext: DbContext\n    {\n        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)\n            : base(options)\n        {\n        }\n        public DbSet<User> User { get; set; }\n        protected override void OnModelCreating(ModelBuilder modelBuilder)\n        {\n            //  base.OnModelCreating(modelBuilder);\n            modelBuilder.Entity<User>().ToTable("User");\n        }\n       \n    }\n
Run Code Online (Sandbox Code Playgroud)\n
\n

笔记:

\n

您应该SQL Table在数据库上进行类似操作,为了使操作更容易,我\n还提供了数据库脚本。

\n
\n

SQL Script:

\n
CREATE TABLE [User]\n(\n    Id UNIQUEIDENTIFIER PRIMARY KEY default NEWID(),\n    [FirstName] [varchar](50) NULL,\n    [LastName] [varchar](50) NULL,\n    [Email] [varchar](50) NULL,\n \n)\nINSERT INTO [User] ([FirstName], [LastName], [Email])\nVALUES ( \'FirstTestName\', \'FirstLastName\', \'testemail.@outlook.com\');\n
Run Code Online (Sandbox Code Playgroud)\n

IGenericRepository:

\n
public interface IGenericRepository<T> where T : class\n    {\n        Task<IEnumerable<T>> All();\n        Task<T> GetById(Guid id);\n        Task<bool> Add(T entity);\n        Task<bool> Delete(Guid id);\n        Task<bool> Upsert(T entity);\n        Task<IEnumerable<T>> Find(Expression<Func<T, bool>> predicate);\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

GenericRepository:

\n
public class GenericRepository<T> : IGenericRepository<T> where T : class\n    {\n        protected ApplicationDbContext context;\n        internal DbSet<T> dbSet;\n        public readonly ILogger _logger;\n\n        public GenericRepository(\n            ApplicationDbContext context,\n            ILogger logger)\n        {\n            this.context = context;\n            this.dbSet = context.Set<T>();\n            _logger = logger;\n        }\n\n        public virtual async Task<T> GetById(Guid id)\n        {\n            return await dbSet.FindAsync(id);\n        }\n\n        public virtual async Task<bool> Add(T entity)\n        {\n            await dbSet.AddAsync(entity);\n            return true;\n        }\n\n        public virtual Task<bool> Delete(Guid id)\n        {\n            throw new NotImplementedException();\n        }\n\n        public virtual Task<IEnumerable<T>> All()\n        {\n            throw new NotImplementedException();\n        }\n\n        public async Task<IEnumerable<T>> Find(Expression<Func<T, bool>> predicate)\n        {\n            return await dbSet.Where(predicate).ToListAsync();\n        }\n\n        public virtual Task<bool> Upsert(T entity)\n        {\n            throw new NotImplementedException();\n        }\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

IUnitOfWork:

\n
public interface IUnitOfWork\n    {\n        IUserRepository Users { get; }\n\n        Task CompleteAsync();\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

UnitOfWork:

\n
public class UnitOfWork : IUnitOfWork, IDisposable\n    {\n        private readonly ApplicationDbContext _context;\n        private readonly ILogger _logger;\n\n        public IUserRepository Users { get; private set; }\n\n        public UnitOfWork(ApplicationDbContext context, ILoggerFactory loggerFactory)\n        {\n            _context = context;\n            _logger = loggerFactory.CreateLogger("logs");\n\n            Users = new UserRepository(context, _logger);\n        }\n        \n        public async Task CompleteAsync()\n        {\n            await _context.SaveChangesAsync();\n        }\n\n        public void Dispose()\n        {\n            _context.Dispose();\n        }\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

UserRepository:

\n
    public class UserRepository : GenericRepository<User>, IUserRepository\n    {\n        public UserRepository(ApplicationDbContext context, ILogger logger) : base(context, logger) { }\n\n        public override async Task<IEnumerable<User>> All()\n        {\n            try\n            {\n                return await dbSet.ToListAsync();\n            }\n            catch (Exception ex)\n            {\n                _logger.LogError(ex, "{Repo} All function error", typeof(UserRepository));\n                return new List<User>();\n            }\n        }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

UnitOfWorkUsersController:

\n
[ApiController]\npublic class UnitOfWorkUsersController : ControllerBase\n{\n    private readonly ILogger<UnitOfWorkUsersController> _logger;\n    private readonly IUnitOfWork _unitOfWork;\n\n    public UnitOfWorkUsersController(\n        ILogger<UnitOfWorkUsersController> logger,\n        IUnitOfWork unitOfWork)\n    {\n        _logger = logger;\n        _unitOfWork = unitOfWork;\n    }\n\n    [HttpGet]\n    public async Task<IActionResult> Get()\n    {\n        var users = await _unitOfWork.Users.All();\n        return Ok(users);\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Program.cs:

\n
public class User\n    {\n        public Guid Id { get; set; }\n        public string FirstName { get; set; }\n        public string LastName { get; set; }\n        public string Email { get; set; }\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

Output:

\n

在此输入图像描述

\n

在此输入图像描述

\n

希望上述步骤能够相应地指导您。如果您还需要more details you can have a look our official document

\n