1

これは私が今持っているインターフェイス/クラス構造です:

BaseContentObject 抽象クラス

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

ページ具象クラス

public class Page : BaseContentObject
{
...
}

リポジトリ インターフェイス

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

global.asax.cs の Ninject ルール

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

1 に答える 1

2

XmlPagesRepository具象クラスを使用してテストケースを作成すると、実際にからに暗黙的に変換できないことがわかると思いますIContentRepository<Page>。従うのは難しいですが、その変換が可能であれば、私はそれを使用してバインドすると思いますToMethod

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

編集:これをもう少し見てみると、変換は不可能です。XmlRepository<Page>実装しIContentRepository<BaseContentObject>ませんIContentRepository<Page>。PageがBaseContentObjectであるかどうかは関係ありません。キャストはできません。これは意図したとおりに機能しません。

Edit2:「実装」とは、インターフェースの実装を指します。インターフェイスを実装し、クラスから継承(または拡張)します。あなたが何をしようとしているのかを完全に理解せずに、これが私がリポジトリを設計する方法です:

public interface IPageRepository : IContentRepository<Page>
{
}

public interface XmlPageRepository : IPageRepository
{
    // implementation
}

これで、IPageRepositoryを複数実装し、Ninjectを使用して適切な実装をバインドできます。

Bind<IPageRepository>().To<XmlPageRepository>();
于 2010-06-30T16:14:10.853 に答える