В вашем примере мне не хватает контекста вашего вызова GetUser. Вероятно, это связано с тем, что со статическим методом вам не нужно думать о том, как вы можете вызывать его из любого места. В DI это означает, что отправитель должен каким-то образом ссылаться на хранилище, скорее всего это поле.
Когда ваш кеш является полем какого-либо объекта, вероятно, фасадом, вы можете использовать это, чтобы сделать кеш прокси вашей базы данных.
Итак, вы бы получили:
class ApplicationFacade{
private IUserRepository users = null;
public doStuff(){
this.users.GetUser("my-name");
}
}
где IUserRepository - это общий интерфейс для вашего кеша, поддельной базы данных и базы данных. Что-то простое, как:
interface IUserRepository{
User GetUser(string username);
}
Ваш кэш теперь может быть простым объектом, реализующим этот интерфейс, и поскольку кэш внедряется, контейнер DI также может внедряться в него.
class Cache : IUserRepository {
private IUserRepository users = null;
public User GetUser(string username){
if (this.NotCached(username)){
this.ToCache(this.users.GetUser(username));
}
return this.FromCache(username);
}
}
Теперь, в зависимости от того, что вы хотите, вы можете вставить свой фальшивый, кеш или базу данных в ваш фасадный объект, и если вы используете ваш кеш-объект, вы можете добавить свою фальшивую базу данных в него по желанию (или даже другой кеш, если вы действительно хотели к).
Конечно, фактический механизм внедрения зависит от вашего DI-контейнера и может потребовать некоторого дополнительного кода в качестве открытых свойств или полей конструктора.