У меня есть интерфейс под названием IXMLModelsRepository
, и у меня есть конкретная реализация под названием XMLModelsRepository
, которая просто читается из файла XML.Ninject: связать интерфейс с несколькими реализациями
Однако я хочу улучшить функцию, и я хочу временно кэшировать элементы в список Dictionary<>
.
Я не хочу изменять существующие XMLModelsRepository
, но я хочу создать новый класс, который добавит функции кеширования сверху.
Как я могу связать, используя Ninject
интерфейс для двух конкретных реализаций?
// the interface i am working with
public interface IXMLModelsRepository
{
Product GetProduct(Guid entity_Id);
}
// concrete implementation that reads from XML document
public class XMLModelsRepository : IXMLModelsRepository
{
private readonly XDocument _xDoc = LoadXMLDocument();
public Product GetProduct(Guid entity_Id)
{
return _xDoc.Element("root").Elements("Product").Where(p => p.Attribute("Entity_Id").Value == entity_Id.ToString();
}
}
// concrete implementation that is only responsable of caching the results
// this is the class that i will use in the project,
// but it needs a parameter of the same interface type
public class CachedXMLModelsRepository : IXMLModelsRepository
{
private readonly IXMLModelsRepository _repository;
public CachedXMLModelsRepository(
IXMLModelsRepository repository)
{
_repository = repository;
}
private readonly Dictionary<Guid, Product> cachedProducts = new Dictionary<Guid, Product>();
public Product GetProduct(Guid entity_Id)
{
if (cachedProducts.ContainsKey(entity_Id))
{
return cachedProducts[entity_Id];
}
Product product = _repository.GetProduct(entity_Id);
cachedProducts.Add(entity_Id, product);
return product;
}
}
Почему вы называете это «IXMLModelsRepository» (с XML). Разве XML не представляет собой деталь реализации, которой не должен заботиться пользователь этого интерфейса? – Steven
Хорошая точка. Модели всегда исходят из XML-файла, и я назвал их XML-моделями, потому что у меня также есть бизнес-модели, которые являются моделями баз данных. – Catalin