2010-06-29 4 views
1

Это структура интерфейсов/класс у меня сейчас:Ninject и репозиторий шаблон с интерфейсами

BaseContentObject абстрактный класс

public abstract class BaseContentObject : IEquatable<BaseContentObject> 
{ 
... 
} 

страница конкретный класс

public class Page : BaseContentObject 
{ 
... 
} 

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; } 
    } 

Общей реализация интерфейса (для всех классов контента, наследующих класс 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); 
     } 
... 
} 

Содержания конкретных репозиториями

public class XmlPagesRepository : XmlRepository<Page> { } 

Ninject правило в Global.asax.cs

Bind<IContentRepository<Page>>().To<XmlPagesRepository>(); 

, что дает следующее ошибка времени компиляции:

*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>'.* 

Я потратил довольно много времени на выяснение своих классов и структуры интерфейсов для поддержки моих бизнес-потребностей. Теперь я не знаю, как пройти эту ошибку Ninject.

Я хочу использовать эту структуру в контроллерах ASP.NET MVC, как это:

public IContentRepository<Page> ContentRepository { get; private set; } 

    public PageController(IContentRepository<Page> repository) 
    { 
     ContentRepository = repository; 
    } 
+0

Wouldnt чтобы дать ошибку времени компиляции - она ​​откроет это для людей, которые столкнулись с этой проблемой и решили ее, даже не рассматривая ее как большую проблему. –

ответ

2

Я думаю, что если вы создаете тестовый пример с использованием конкретных классов, которые вы увидите, что на самом деле вы не можете неявно преобразовать от XmlPagesRepository до IContentRepository<Page>. Это трудно следовать, но если это преобразование возможно, то я думаю, что связать его с помощью ToMethod:

Bind<IContentRepository<Page>>().ToMethod(x => (IContentRepository<Page>)kernel.Get<XmlPagesRepository>()); 

Редактировать: Глядя на это несколько больше, преобразование не представляется возможным. XmlRepository<Page> инвентарь IContentRepository<BaseContentObject> не IContentRepository<Page>. Не имеет значения, что Страница является объектом BaseContentObject, литье не представляется возможным. Это не будет работать так, как вы планировали.

Редактирование2: «Реализация» относится к реализации интерфейса; вы реализуете интерфейс и наследуете (или расширяете) класс. Без полного понимания того, что вы пытаетесь сделать, это, как я бы дизайн репозиториев:

public interface IPageRepository : IContentRepository<Page> 
{ 
} 

public interface XmlPageRepository : IPageRepository 
{ 
    // implementation 
} 

Теперь вы можете иметь несколько реализаций IPageRepository и связать соответствующий его с помощью Ninject:

Bind<IPageRepository>().To<XmlPageRepository>(); 
+0

Если вы можете понять, что требует мой случай (семантически), можете ли вы предложить альтернативную реализацию? – mare

+0

Если вы хотите продолжить путь по тому же пути, вы можете просто создать реализацию 'IContentRepository '. Я предлагаю определить «IPageRepository» (возможно, «IContentRepository »), реализованный им «XmlPageRepository». –

+0

Мне трудно понять, что вы имеете в виду именно потому, что вы используете слова, реализованные и реализующие пару раз. Если вы можете уточнить это или еще лучше изменить мой код в своем ответе на уровень, который я могу представить себе, что вы имеете в виду, я приму ваш ответ. – mare