Cat*_*lin 3 c# asp.net dependency-injection ninject
我有一个名为的接口IXMLModelsRepository,我有一个具体的实现XMLModelsRepository,只需从XML文件中读取.
但是,我想改进功能,我想暂时将元素缓存到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;
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用该WhenInjectedExactlyInto构造.
kernel.Bind<IXMLModelsRepository >().To<CachedXMLModelsRepository>();
kernel.Bind<IXMLModelsRepository >().To<XMLModelsRepository>()
.WhenInjectedExactlyInto(typeof(CachedXMLModelsRepository));
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,Ninject将使用缓存的实例进行接口的所有查找,但是在构建缓存的存储库时,它会注入非缓存的对象.
| 归档时间: |
|
| 查看次数: |
1527 次 |
| 最近记录: |