Presenterò questa domanda con la frase: so che il seguente è un cattivo design, ma il refactoring non è attualmente un'opzione, idealmente dovrebbe essere fatto usando gli intercettori.Qual è la differenza tra una dipendenza del componente e di un servizio?
Sto lavorando all'aggiornamento del castello da 1.6 (credo) a 3.3 che sfortunatamente comporta alcune modifiche alla sintassi, ora ho tutto in fase di compilazione ma alcuni dei miei test intorno al contenitore dei servizi non funzionano.
Ho un repository che ha diverse implementazioni per fornire funzionalità differenti, il repository è sempre e solo utilizzato con tutte le diverse implementazioni in linea, qui sono i principi fondamentali del codice:
The Windsor Castle registrazioni:
RepositoryRegistration<IAccountRepository, AccountRepositoryFeedEntryDecorator>()
.DependsOn(Dependency.OnComponent("decoratedRepository", typeof(AccountRepositoryAuthorizationDecorator))),
RepositoryRegistration<AccountRepositoryAuthorizationDecorator>()
.DependsOn(Dependency.OnComponent("decoratedRepository", typeof(AccountRepositoryMaskingDecorator))),
RepositoryRegistration<AccountRepositoryMaskingDecorator>()
.DependsOn(Dependency.OnComponent("decoratedRepository", typeof(AccountRepository))),
RepositoryRegistration<AccountRepository>());
procedimento RepositoryRegistration:
private static ComponentRegistration<TRepository> RepositoryRegistration<TRepository, TConcreteRepository>()
where TConcreteRepository : TRepository where TRepository : class
{
return Component
.For<TRepository>()
.ImplementedBy<TConcreteRepository>()
.Named(typeof(TConcreteRepository).Name);
}
interfaccia di base:
public interface IAccountRepository
{
string Create(Account account);
void Update(Account account);
Account Get(string accountId);
}
Le implementazioni:
public class AccountRepositoryFeedEntryDecorator : IAccountRepository
{
private readonly IAccountRepository decoratedRepository;
public AccountRepositoryFeedEntryDecorator(
IAccountRepository decoratedRepository)
{
this.decoratedRepository = decoratedRepository;
}
string Create(Account account)
{
//Add Entry To Feed
return decoratedRepository.Create(account);
};
void Update(Account account)
{
//Add Entry To Feed
return decoratedRepository.Udpate(account);
}
Account Get(string accountId);
{
//Add Entry To Feed
return decoratedRepository.Get(accountId);
}
}
public class AccountRepositoryAuthorizationDecorator : IAccountRepository
{
private readonly IAccountRepository decoratedRepository;
public AccountRepositoryAuthorizationDecorator(
IAccountRepository decoratedRepository)
{
this.decoratedRepository = decoratedRepository;
}
string Create(Account account)
{
//Ensure User Is Authorized
return decoratedRepository.Create(account);
};
void Update(Account account)
{
//Ensure User Is Authorized
return decoratedRepository.Udpate(account);
}
Account Get(string accountId);
{
//Ensure User Is Authorized
return decoratedRepository.Get(accountId);
}
}
public class AccountRepositoryMaskingDecorator : IAccountRepository
{
private readonly IAccountRepository decoratedRepository;
public AccountRepositoryMaskingDecorator(
IAccountRepository decoratedRepository)
{
this.decoratedRepository = decoratedRepository;
}
string Create(Account account)
{
//Mask Sensitive Information
return decoratedRepository.Create(account);
};
void Update(Account account)
{
//Mask Sensitive Information
return decoratedRepository.Udpate(account);
}
Account Get(string accountId);
{
//Mask Sensitive Information
return decoratedRepository.Get(accountId);
}
}
public class AccountRepository : IAccountRepository
{
string Create(Account account)
{
//Create account and return details
};
void Update(Account account)
{
//Update account and return details
}
Account Get(string accountId);
{
//Return Account
}
}
E finalmente ecco l'errore che sto ottenendo nel mio test:
Castle.MicroKernel.Handlers.HandlerException: Impossibile creare il componente ' AccountRepositoryFeedEntryDecorator 'poiché ha dipendenze da soddisfare.
'AccountRepositoryFeedEntryDecorator' sta aspettando le seguenti dipendenze: - Component 'Shaw.Services.CustomerManagement.Host.Repositories.Sql.Decorators.AccountRepositoryAuthorizationDecorator' (via override) che è stato registrato, ma è anche in attesa di dipendenze.
'Shaw.Services.CustomerManagement.Host.Repositories.Sql.Decorators.AccountRepositoryAuthorizationDecorator' sta aspettando le seguenti dipendenze: - Servizio 'AccountRepositoryFeedEntryDecorator' che è stato registrato, ma è anche in attesa di dipendenze.
A prima vista sembra che ci sia una sorta di dipendenza circolare, ma non riesco davvero a vedere come.
Quindi la domanda in due parti, qual è la differenza tra le specifiche di dipendenza del componente e del servizio nel messaggio di errore, qualsiasi ipotesi su cosa stia succedendo.
Se è importante qui è la registrazione originale prima dell'aggiornamento:
RepositoryRegistration<IAccountRepository, AccountRepositoryFeedEntryDecorator>()
.ServiceOverrides(new { decoratedRepository = typeof(AccountRepositoryAuthorizationDecorator).Name }),
RepositoryRegistration<AccountRepositoryAuthorizationDecorator>()
.ServiceOverrides(new { decoratedRepository = typeof(AccountRepositoryMaskingDecorator).Name }),
RepositoryRegistration<AccountRepositoryMaskingDecorator>()
.ServiceOverrides(new { decoratedRepository = typeof(AccountRepository).Name }),
RepositoryRegistration<AccountRepository>()
Ciao Patrick, ho appena provato questa soluzione, ma ora ricevo un errore che in primo luogo si lamenta che sta indicando il servizio, poi dice che ci sono altri componenti che corrispondono e continuano ad avere lo stesso problema di dipendenza "circolare". – Phaeze
Riporto a prima vista sembra un problema di registrazione completamente diverso. – Phaeze
@Phaeze Ah ok, beh se è collegato sentiti libero di aggiornare la tua domanda, altrimenti potrebbe avere senso come una nuova domanda del tutto. –