gpt4 book ai didi

asp.net-core - 使用 Dapper 的存储库模式依赖注入(inject)

转载 作者:行者123 更新时间:2023-12-04 19:33:39 25 4
gpt4 key购买 nike

我的 Startup.cs 包含 40 个存储库:

services.AddScoped<IUserRepository, UserRepository>();
services.AddScoped<IXRepository, XRepository>();
... 40 more lines ...

我正在尝试找到一种方法来将这些困惑处理在一行中,但我很遗憾地无法解决这个问题,我有几种方法在界面中不可用。有人可以提供帮助吗?我明白为什么它不起作用,它没有具体的存储库,但我离完成这项工作还差得很远。

InvalidOperationException:无法解析类型的服务...

// IRepository.cs
public interface IRepository
{
}

// IUserRepository.cs
public interface IUserRepository : IRepository
{
User ReadToken(string email, string password);
}

// BaseRepository.cs
public class BaseRepository : IDisposable
{
protected IDbConnection PostgreSQL;

public BaseRepository(IDbConnection postgreSQL)
{
PostgreSQL = postgreSQL;
}

public void Dispose()
{
}
}

// UserRepository.cs
public class UserRepository : BaseRepository, IUserRepository
{
public UserRepository(IDbConnection postgreSQL) : base(postgreSQL)
{
}

public User ReadToken(string email, string password)
{
object parameters;
string sql;

parameters = new
{
email,
password
};

sql =
@"
SELECT
user_id AS id,
token
FROM users
WHERE
email = @email AND
password = CRYPT(@password, password) AND
active = TRUE;
";

var user = base.PostgreSQL.Query<User>(sql, parameters).SingleOrDefault();

if (user == null)
throw new UnauthorizedException("User", "User not found.");

return user;
}
}

// UsersController.cs
public class UsersController : ControllerBase
{
protected IUserRepository UserRepository;

public UsersController(IUserRepository userRepository)
{
UserRepository = userRepository;
}
}

// Startup.cs
services.AddTransient<IRepository, BaseRepository>();

最佳答案

你可以用 Scrutor 做到这一点

它为 Microsoft.Extensions.DependencyInjection 提供程序集扫描和修饰扩展

所有这些存储库可以总结为如下内容:

services.Scan(x => x.FromAssemblyOf<IAnAssemblyRegistrationMarker>()
.AddClasses(filter => filter.AssignableTo(typeof(IRepository)))
.AsImplementedInterfaces()
.WithScopedLifetime());

IAnAssemblyRegistrationMarker 是一个空接口(interface),指向要扫描的程序集(项目)

AddClasses 从选定的程序集中添加所有公共(public)的、非抽象的类,这些类符合

中指定的要求

AsImplementedInterfaces 将每个匹配的具体类型注册为其所有已实现的接口(interface)

WithScopedLifetime 将每个匹配的具体类型注册到 Scoped Lifetime(您还有 WithSingletonLifetimeWithTransientLifetime)

上述代码示例中的唯一要求是存储库实现 IRepository,以便您仅定位必要的项目。

免责声明:我与 Scrutor 没有任何关联。我就是喜欢这个东西。

关于asp.net-core - 使用 Dapper 的存储库模式依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49266240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com