如果你想在特定条件下访问实现,你可以使用 Dictionary。
UC_Login:用户必须根据身份验证模式(通过数据库或活动目录)验证他们的凭据,每种身份验证模式都有不同的业务逻辑。
我的代码:我有一个名为 IAuthService.cs 的接口 我有两个名为 DatabaseAuthService.cs 和 ActiveDirectoryAuthService.cs 的类,它们都具有依赖于同一接口的相同 IsValidCredential(用户用户)方法。
public interface IAuthService
{
Task<bool> IsValidCredentialAsync(User user);
}
public class DatabaseAuthService : IAuthService
{
private readonly IDatabaseAuthRepository _databaseAuthRepository;
// User IServiceProvider for access to any other interfaces
// using Microsoft.Extensions.DependencyInjection; using System;
public DatabaseAuthService(IServiceProvider serviceProvider)
=> _databaseAuthRepository = serviceProvider.GetService<IDatabaseAuthRepository>();
public async Task<bool> IsValidCredentialAsync(User user)
{
// return await _databaseAuthRepository.something...
}
}
public class LdapAuthService : IAuthService
{
public LdapAuthService()
{
}
public async Task<bool> IsValidCredentialAsync(User user)
{
// something...
}
}
实现条件:我使用 AuthenticationAppService 类和 LoginAsync (LoginDto dto) 方法。
public class AuthenticationAppService
{
private readonly Dictionary<AuthenticationModeEnum, IAuthService> _authProviders =
new Dictionary<AuthenticationModeEnum, IAuthService>();
public AuthenticationAppService(IServiceProvider serviceProvider)
{
_authProviders.Add(AuthenticationModeEnum.Database, new DatabaseAuthService(serviceProvider));
_authProviders.Add(AuthenticationModeEnum.ActiveDirectory, new LdapAuthService());
}
public Task<bool> LoginAsync(LoginDto dto)
{
var user = Mapper.Map<user, LoginDto>(dto);
return await _authProviders[(AuthenticationModeEnum)dto.AuthMode].IsValidCredentialAsync(user);
}
}
也许不是主题,但希望它有所帮助。