基本ライブラリで定義されている次のクラス/インターフェイスがあるとします。
public interface IWorkContext {
T Node<T>() where T : class, IHierachy<T>;
IHierachyItem Node();
}
public interface IHierachyItem {
int Id { get; set; }
string Title { get; set; }
}
public interface IHierachy<T> : IHierachyItem where T : IHierachy<T> {
T Parent { get; set; }
IList<T> Children { get; set; }
}
public class WorkContext {
public static IWorkContext Current {
get { return DependencyResolver.Current.GetService<IWorkContext>(); }
}
}
これは、別のライブラリ(上記のベースライブラリを参照する)内で次の意味を持ちます。
public class DefaultWorkContext : IWorkContext {
// Nhibernate session
private readonly ISession _session;
public DefaultWorkContext(ISession session) {
_session = session;
}
public T Node<T>() where T : class, IHierachy<T> {
return _session.Get<T>(2);
}
public IHierachyItem Node() {
return Node<SiteMapNode>();
}
}
SiteMapNodeが同じライブラリに存在する(そしてデータベーステーブルにマップされている)場合:
public class SiteMapNode : IHierachy<SiteMapNode> {
public virtual int Id { get; set; }
public virtual SiteMapNode Parent { get; set; }
public virtual string Title { get; set; }
public virtual IList<SiteMapNode> Children { get; set; }
public SiteMapNode() {
Children = new List<SiteMapNode>();
}
}
ノードにアクセスして親を取得するには、次のように言うことができます。
var node = WorkContext.Current.Node();
var parentNode = ((IHierachy<SiteMapNode>)node).Parent;
var node2 = WorkContext.Current.Node<SiteMapNode>();
var parentNode2 = node2.Parent;
ただし、オプション1にはケースが必要であり、オプション2ではデフォルトのタイプを渡す必要があるため、どちらのアプローチも好きではありません。
IDとタイトルを取得するのと同じ方法で親と子にアクセスできるように、このサンプルをリファクタリングすることは可能ですか。
問題を十分に明確に説明できたと思います。助けていただければ幸いです。ありがとう