我有一个类似的问题,为了解决它,我做了一些服务单例。然后我做了一个只能调用一次的配置方法。然后您可以在 global.asax 文件中调用该方法
安全服务.cs:
public sealed class SecurityService {
private ISecurityRepository _repository;
public static SecurityService Instance { get; private set; }
private SecurityService(ISecurityRepository repository) {
_repository = repository;
}
public static void Configure(ISecurityRepository repository) {
Instance = new SecurityService(repository);
}
public Model.LoginResponse GetUser(Model.UserRequest request) {
if (string.IsNullOrEmpty(request.SecurityToken)) return null;
User user = _repository.GetUserByToken(request.SecurityToken);
if (user == null) throw new HabitationException("Invalid Security Token. Please login.", null);
return AutoMapper.Mapper.Map<Model.LoginResponse>(user);
}
public Model.LoginResponse Login(Model.LoginRequest request) {
string strPassword = EncryptPassword.GetMd5Hash(request.Password);
User user = _repository.GetUser(request.Username, strPassword);
return AutoMapper.Mapper.Map<Model.LoginResponse>(user);
}
internal User GetLoggedInUser(string securityToken) {
if (string.IsNullOrEmpty(securityToken)) {
return null;
}
User user = _repository.GetUserByToken(securityToken);
if (user == null) throw new HabitationException("Invalid Security Token.", null);
return user;
}
}
全球.asax:
protected void Application_Start() {
MyProject.LinqToSQL.Repositories.SecurityRepository securityRepository = new MyProject.Repository.LinqToSQL.Repositories.SecurityRepository(connection);
MyProject.Repository.HttpCache.Repositories.SecurityRepository securityCacheRepository = new MyProject.Repository.HttpCache.Repositories.SecurityRepository(securityRepository);
MyProject.Domain.Service.Interface.SecurityService.Configure(securityCacheRepository);
}
注意:这里有两个存储库,因为我使用的是策略模式。我的一些存储库可以传递额外的存储库,如果他们没有找到对象,他们可以调用嵌套存储库。在这种情况下,效果是如果它不在 HttpCache 中,它会检查数据库。但这有点跑题了。
现在,在另一个服务中,您可以调用任何实例方法:
SecurityService.Instance.GetLoggedInUser(SecurityToken);
注意:在我的示例中,我没有对服务类使用依赖注入,仅对存储库使用依赖注入。