2013-09-27 4 views
3

У меня есть интерфейс под названием 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; 
    } 
} 
+0

Почему вы называете это «IXMLModelsRepository» (с XML). Разве XML не представляет собой деталь реализации, которой не должен заботиться пользователь этого интерфейса? – Steven

+0

Хорошая точка. Модели всегда исходят из XML-файла, и я назвал их XML-моделями, потому что у меня также есть бизнес-модели, которые являются моделями баз данных. – Catalin

ответ

5

Вы можете использовать конструкцию WhenInjectedExactlyInto.

kernel.Bind<IXMLModelsRepository >().To<CachedXMLModelsRepository>(); 
kernel.Bind<IXMLModelsRepository >().To<XMLModelsRepository>() 
    .WhenInjectedExactlyInto(typeof(CachedXMLModelsRepository)); 

В приведенном выше примере Ninject будет использовать кэшированный экземпляр для всех операций поиска интерфейса, но при построении кэшированных хранилищ, было бы впрыскивать некэшируемый объект.

+0

Не может работать лучше! – Catalin

Смежные вопросы