Creazione di un'interfaccia solo per disaccoppiare da librerie di terze parti

3

Attualmente sto sviluppando il modulo Autorizzazione su un mio framework.

Ho finora la seguente classe:

public interface IAuthorizationManager<C>
       where C : AuthorizationConfiguration
{
    void Configure(C configuration);
}

Una delle mie implementazioni sarà l'autenticazione OAuth.

Per questo ho creato il seguente gestore:

public class OAuthAuthorizationManager : IAuthorizationManager<OAuthConfiguration>
{
    private IOAuthAuthorizationServerProvider _authorizationProvider;
    private IAuthenticationTokenProvider _refreshTokenProvider;

    public AuthorizationManager(IOAuthAuthorizationServerProvider authorizationProvider,
                                IAuthenticationTokenProvider refreshTokenProvider)
    {
        this._authorizationProvider = authorizationProvider;
        this._refreshTokenProvider = refreshTokenProvider;
    }

    public void Configure(OAuthConfiguration configuration)
    {
       configuration.Application.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions() {
             AllowInsecureHttp = !configuration.IsSecure,
             TokenEndpointPath = new PathString(configuration.TokenEndpoint),
             AccessTokenExpireTimeSpan = configuration.TokenExpiration,
             Provider = _authorizationProvider,
             RefreshTokenProvider = _refreshTokenProvider
       });
       configuration.Application.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
    }
}

Ora, ecco la cosa, le implementazioni di IOAuthAuthorizationServerProvider e IAuthenticationTokenProvider verranno iniettate tramite il costruttore.

Sto usando Ninject per l'iniezione delle dipendenze.

Nel progetto di avvio della mia applicazione ho il seguente modulo:

public class AuthorizationModule : ApplicationModule
{
      public override void Load()
      {
          Kernel.Bind<IOAuthAuthorizationServerProvider>().To<AuthorizationProvider<User, Client>>();
          Kernel.Bind<IAuthenticationTokenProvider>().To<RefreshTokenProvider<RefreshToken>();

          Kernel.Bind<IAuthorizationManager<OAuthConfiguration>>().To<OAuthAuthorizationManager>();
      }
}

Il problema è che le interfacce IOAuthAuthorizationServerProvider e IAuthenticationTokenProvider fanno parte della libreria Owin.Security.OAuth , quindi quando sto configurando l'iniezione, il progetto di avvio dell'applicazione deve fare direttamente riferimento a questa libreria e alle sue dipendenze. Questo inquina il mio packages.config . Non mi piace l'idea di avere la stessa libreria referenziata due volte nella mia soluzione, quando solo un progetto effettivamente la usa.

AuthorizationProvider<User, Client> e RefreshTokenProvider<RefreshToken> sono le mie, quindi non c'è problema con quelle.

Stavo pensando di creare un'interfaccia come questa (ovviamente avrei scelto un altro nome):

public class IMyOAuthAuthorizationServerProvider : IOAuthAuthorizationServerProvider { }

public class IMyAuthenticationTokenProvider : IAuthenticationTokenProvider { }

Insieme alle modifiche associate:

public AuthorizationManager(IMyOAuthAuthorizationServerProvider authorizationProvider, IMyAuthenticationTokenProvider refreshTokenProvider)
{
    this._authorizationProvider = authorizationProvider;
    this._refreshTokenProvider = refreshTokenProvider;
}

E

Kernel.Bind<IMyOAuthAuthorizationServerProvider>().To<AuthorizationProvider<User, Client>>();
Kernel.Bind<IMyAuthenticationTokenProvider>().To<RefreshTokenProvider<RefreshToken>>();

Ovviamente Owin.Security.OAuth continuerà a essere referenziato, ma questa volta indirettamente, quindi non ho bisogno di installarli (tramite NuGet) sul mio progetto principale.

Volevo sapere se questa è una pratica comune, quali sono gli svantaggi di questo approccio e qualsiasi suggerimento o soluzione alternativa sarebbe altamente (e volentieri) accettato.

    
posta Matias Cicero 02.07.2015 - 02:32
fonte

1 risposta

3

Ninject fornisce un approccio basato su file di configurazione (come qui )? Penso che se lo facessi il tipo verrebbe caricato dinamicamente, e voilà! - Nessuna dipendenza nel tuo progetto.

Lo svantaggio è che ora hai potenziali errori di runtime invece di quelli in fase di compilazione, ma penso che sia quello che preferiresti avere nella tua situazione.

    
risposta data 02.07.2015 - 03:01
fonte

Leggi altre domande sui tag