同じ親から継承するオブジェクトで、親クラス (独自のアセンブリ内) で internal としてマークされているメソッドにアクセスしようとしています。
私がやろうとしていることを説明させてください...
基になる List を持つ IEnumberable を非 Service クラス (UI など) に返し、オプションで基になる IQueryable を持つ IEnumerable を他のサービスに返す Service クラスを作成したいと考えています。
以下に示すように、私が達成しようとしていることを示すためにいくつかのサンプルコードを書きました。この例は実際のものではないため、コメントするときはそのことを覚えておいてください。
すべてのサービスは、次のようなものから継承されます (関連するコードのみを示します)。
public class ServiceBase<T>
{
protected readonly ObjectContext _context;
protected string _setName = String.Empty;
public ServiceBase(ObjectContext context)
{
_context = context;
}
public IEnumerable<T> GetAll()
{
return GetAll(false);
}
//These are not the correct access modifiers.. I want something
//that is accessible to children classes AND between descendant classes
internal protected IEnumerable<T> GetAll(bool returnQueryable)
{
var query = _context.CreateQuery<T>(GetSetName());
if(returnQueryable)
{
return query;
}
else
{
return query.ToList();
}
}
private string GetSetName()
{
//Some code...
return _setName;
}
}
継承されたサービスは次のようになります。
public class EmployeeService : ServiceBase<Employees>
{
public EmployeeService(ObjectContext context)
: base(context)
{
}
}
public class DepartmentService : ServiceBase<Departments>
{
private readonly EmployeeService _employeeService;
public DepartmentService(ObjectContext context, EmployeeService employeeService) : base(context)
{
_employeeService = employeeService;
}
public IList<Departments> DoSomethingWithEmployees(string lastName)
{
//won't work because method with this signature is not visible to this class
var emps = _employeeService.GetAll(true);
//more code...
}
}
親クラスのライブは再利用可能であるため、子サービスとは別のアセンブリに存在します。GetAll(bool returnQueryable) が internal としてマークされていると、子は互いの GetAll(bool) メソッドを見ることができず、public GetAll() メソッドだけを見ることができません。
アセンブリ内の各子サービスが互いのメソッドを認識できるように、新しい内部 GetAll メソッドを各サービス (または同じアセンブリ内の中間の親クラス) に追加できることを知っています。しかし、機能は親クラスで既に利用可能であるため、不要のようです。
例えば:
internal IEnumerable<Employees> GetAll(bool returnIQueryable)
{
return base.GetAll(returnIQueryable);
}
基本的に私が望むのは、サービスが IQueryable として他のサービス メソッドにアクセスできるようにすることです。これにより、コミットされていない結果をさらに絞り込むことができ、他のすべての人は単純な古いリストを取得できます。
何か案は?
編集
ご存知のように、私はこれを使ってちょっとしたコード ゴルフを楽しんでいましたが、クラスではなくインターフェイスを渡しているため、最終的にはこのスキームを使用することはできません。
したがって、私の例では GetAll(bool returnIQueryable) はインターフェイスに含まれていません。つまり、キャストを行う必要があり、これは私が達成しようとしていることに反します。
脳のおならがあったのか、それともうまくいくと思ったものを手に入れようとして興奮しすぎたのかはわかりません. いずれにせよ、応答に感謝します。