Ich habe eine Anwendung aus DAL, BLL und der API-Schicht und Iam mit Einheit für die Injektion zusammengesetzt. In der Business-Schicht habe ich eine Klasse namens AuthRepository, wo sie von IAuthRepository erbt, das folgende Teil dieser Klasse ist.Verwendung von Unity in einer 3-Schicht-Anwendung
Klasse AuthRepository in BLL:
public class AuthRepository : IAuthRepository, IDisposable
{
private UserAuthContext _authContext;
private UserManager<UserInfo> _userManager;
// Issue 1: this constructor should be delete and use injection instead
// to solve the problem in class SimpleAuthorizationServerProvider
public AuthRepository()
{
_authContext = new UserAuthContext();
_userManager = new UserManager<UserInfo>(new UserStore<UserInfo>(_authContext));
}
public AuthRepository(UserAuthContext authContext)
{
_authContext = authContext;
//this._authContext = new UserAuthContext();
_userManager = new UserManager<UserInfo>(new UserStore<UserInfo>(_authContext)); // TODO: implement usermanager with Unity
}
public async Task<IdentityResult> RegisterUser(UserEntity createUserModel)
{
UserInfo user = new UserInfo
{
FirstName = createUserModel.FirstName,
LastName = createUserModel.LastName,
UserName = createUserModel.UserName,
Email = createUserModel.Email
};
var result = await _userManager.CreateAsync(user, createUserModel.Password);
return result;
}
in der API-Ebene Ich habe eine andere Klasse, die SimpleAuthorizationServerProvider genannt wird, die Klasse kümmern sich um die Token-Bär zur Verfügung gestellt von Owin folgenden wird die Klasse
Klasse SimpleAuthorizationServerProvider in API Schicht:
public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
// Resource owner password credentials does not provide a client ID.
if (context.ClientId == null)
{
context.Validated();
}
return Task.FromResult<object>(null);
}
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
using (AuthRepository _repo = new AuthRepository())
{
IdentityUser user = await _repo.FindUser(context.UserName, context.Password);
if (user == null)
{
context.SetError("invalid_grant", "The user name or password is incorrect.");
return;
}
}
var identity = new ClaimsIdentity(context.Options.AuthenticationType);
identity.AddClaim(new Claim("sub", context.UserName));
identity.AddClaim(new Claim("role", "user"));
context.Validated(identity);
}
}
das Problem ist, dass der erste Konstruktor in AuthRepository sollte remov sein um Anwendung lausig gekoppelt zu machen. Wenn ich diesen Konstruktor löschen, so brauche ich einen Parameter vom Typ UserAuthContext aus der SimpleAuthorizationServerProvider Klasse in den Verfahren GrantResourceOwnerCredentials bei dieser Aussage
mit (AuthRepository _repo = new AuthRepository()) senden
und das ist was ich nicht tun möchte, sollte der API-Layer mit dem BLL und nicht mit dem DAL kommunizieren.
Irgendeine Idee, wie man das löst?
das ist registrieren, was ich zu tun versucht, aber wenn ich SimpleAuthorizationServerProvider in der Startup-Klasse registrieren, werde ich vor dem gleiche Problem, dass der Konstruktor in Der SimpleAuthorizationServerProvider benötigt einen Parameter vom Typ IAuthRepository. Glauben Sie, dass DI mit propreties anstelle von constructor dieses Problem lösen könnte? –
Sie sollten eine konkrete Klasse für 'IAuthRepository' registrieren mit' RegisterType() 'wie folgt:' yourContainer.RegisterType (); ' –
venerik
Ich habe bro, ich habe diesen Schritt bereits getan. Mein Problem ist, dass ich einen Parameter vom Typ UserAuthContext in SimpleAuthorizationServerProvider-Klasse in GrantResourceOwnerCredentials-Methode senden muss, –