C'est la structure des interfaces/classe J'ai maintenant:Ninject et modèle référentiel avec des interfaces
BaseContentObject classe abstraite
public abstract class BaseContentObject : IEquatable<BaseContentObject>
{
...
}
page classe concrète
public class Page : BaseContentObject
{
...
}
Interface Repository
public interface IContentRepository<T>
{
// common methods for all content types
void Insert(T o);
void Update(T o);
void Delete(string slug);
void Delete(ContentType contentType, string slug);
IEnumerable<T> GetInstances();
T GetInstance(ContentType contentType, string slug);
T GetInstance(string contentType, string slug);
T GetInstance(string slug);
IEnumerable<string> GetSlugsForContentType(int limit = 0, string query = "");
ContentList GetContentItems();
bool IsUniqueSlug(string slug);
string ObjectPersistanceFolder { get; set; }
}
mise en œuvre de l'interface commune (pour toutes les classes de contenu héritant classe BaseContentObject)
public class XmlRepository<T> : IContentRepository<BaseContentObject>
{
public string ObjectPersistanceFolder { get; set; }
public XmlRepository()
{
ObjectPersistanceFolder = Path.Combine(XmlProvider.DataStorePhysicalPath, typeof(T).Name);
if (!Directory.Exists(ObjectPersistanceFolder))
Directory.CreateDirectory(ObjectPersistanceFolder);
}
...
}
contenu du référentiel spécifique
public class XmlPagesRepository : XmlRepository<Page> { }
règle Ninject dans Global.asax.cs
Bind<IContentRepository<Page>>().To<XmlPagesRepository>();
qui donne les éléments suivants erreur de compilation:
*The type 'Namespace.XmlPagesRepository' cannot be used as type parameter 'TImplementation' in the generic type or method 'Ninject.Syntax.IBindingToSyntax<T>.To<TImplementation>()'. There is no implicit reference conversion from 'Namespace.XmlPagesRepository' to 'Namespace.IContentRepository<Namespace.Page>'.*
J'ai passé un certain temps à déterminer mes classes et ma structure d'interfaces pour répondre à mes besoins d'affaires. Maintenant, je ne sais pas comment passer cette erreur Ninject.
Je veux utiliser cette structure dans les contrôleurs ASP.NET MVC comme ceci:
public IContentRepository<Page> ContentRepository { get; private set; }
public PageController(IContentRepository<Page> repository)
{
ContentRepository = repository;
}
wouldnt blesser pour donner l'erreur de compilation - cela ouvrira la porte à ceux qui ont touché ce problème et l'ont résolu sans même le considérer comme un gros problème. –