0

私は、Entity Framework DbContext型の基本クラスを使用するリポジトリプロジェクト内にいくつかのリポジトリクラスを持っています。Castleウィンザーがベースクラスを作成/公開していない

基本クラス

public class RepositoryBase<TC> : IDisposable 
    where TC : DbContext, new() 
{ 

    public virtual T Get<T>(...) where T : class 
    { 
     ... 
    } 

    // ... additional code 
} 

従業員のレポインタフェース

namespace Insight.Repository.Interfaces 
{ 
    public interface IEmployeeRepository 
    { 
     Result CreateEmployee(Employee employee); 
     // ... additional code 
    } 
} 

従業員のレポ

namespace Insight.Repository.Repositories 
{ 
    public class EmployeeRepository : RepositoryBase<InsightContext>, IEmployeeRepository 
    { 
     public Result CreateEmployee(Employee employee) 
     { 
      return Save(employee); 
     } 
    } 
    // ... additional code 
} 

私が使用してAsp.Mvcウェブサイト内ウィンザーコンテナにレポクラスを追加していリポジトリプロジェクト内のインタフェースに基づくインストーラ。私はこの時点でコンテナを見てきました。私は3つのリポジトリを取得しています。

public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(Classes.FromAssemblyNamed("Insight.Repository") 
      .Where(Component.IsInNamespace("Insight.Repository.Repositories")) 
      .WithService.DefaultInterfaces() 
      .LifestyleTransient()); 
    } 

次のようにDbContextを登録しようとしましたが、同じ結果が得られました。

container.Register(Component.For<DbContext>() 
      .ImplementedBy<InsightContext>() 
      .LifestyleTransient()); 

その後、私のApiController以内に、私は、レポのクラスをインスタンス化するには、プロパティインジェクションを使用していますが、私は、基本クラスの関数のいずれかにアクセスすることができません。

public class EmployeeController : ApiController 
{ 
    public IEmployeeRepository EmployeeRepo { get; set; } 

    [Route("GetEmployee")] 
    public void Get() 
    { 
     var newEmployeeRepo = new EmployeeRepository(); 
    } 
} 

EmployeeRepoは、基本クラスのGet()関数にアクセスすることはできませんが、newEmployeeRepoはアクセスしません。

これは、Castle.Windsorを使用した私の最初のプロジェクトです。登録手順のいくつかの種類が明らかに欠けていますが、それを理解することができます。

誰かが私を正しい方向に向けることができれば、非常に感謝しています。

編集:この行のtym32167

void Main() 
{ 
    var container = new WindsorContainer(); 

    var type = typeof(II); 
    container.Register(Classes.FromAssembly(type.Assembly) 
     .Where(Component.IsInNamespace(type.Namespace)) 
     .WithService.AllInterfaces() 
     .LifestyleTransient()); 

    var cls = container.Resolve<II>().Dump(); 
    cls.GetFirstName().Dump(); 
    cls.GetLastName().Dump(); 
} 

public interface II 
{ 
    string GetFirstName(); 
} 

public class MyClass : II 
{ 
    public string GetFirstName() 
    { 
    return "First Name"; 
    } 

    public string GetLastName() 
    { 
    return "Last Name"; 
    } 
} 

コードブレークによって供給Linqpadコードとテスト:

cls.GetLastName().Dump(); 

が、これは正常な動作ですか?

答えて

0

を試してみてください、あなたが必要です基本インターフェースを持つこと:

public interface IBaseRepo<T> 
{ 
    T Get(int id); 
    // ... 
} 

public interface IEmployeeRepo : IBaseRepo<Employee> 
{ 
    Employee GetByFirstName(string name); 
    // ... 
} 

子インターフェイスがベースインターフェイスを継承する仕組みに注意してください。したがって、IEmployeeRepoを実装するすべてのタイプは、IBaseRepo<Employee>も実装することを保証し、1つを注入すると、ベースインターフェイスのメソッドにもアクセスできます。

具体的な従業員レポが継承する基本レポを実装するという事実は、クライアントコードが気にする必要のない実装の詳細です。今はそうではありません。

+0

そんなことを言えば、それははっきりと聞こえます。ありがとう、そのソリューションは魅力的でした。 – Vazmo

0

は、基本クラスのメソッドへのアクセスを取得するには(ちょうどlinqpadで確認)サンプルとして

.WithService.AllInterfaces() 

.WithService.DefaultInterfaces() 

を交換する

void Main() 
{ 
    var container = new WindsorContainer(); 

    var type = typeof(II); 
    container.Register(Classes.FromAssembly(type.Assembly) 
      .Where(Component.IsInNamespace(type.Namespace)) 
      .WithService.AllInterfaces() 
      .LifestyleTransient()); 

    container.Resolve<II>().Dump(); 
} 

public interface II 
{ 
} 

public class MyCl : II 
{ 
} 
+0

私は示唆したように変更を行いましたが、追加のIDisposableインターフェイスをRepositoryBaseクラスから取得するように見えました。 登録後にコンテナを見ると、** EmployeeRepository/IEmployeeRepository = Transient **が** EmployeeRepository/IEmployeeRepositoryに変更され、コンテナのコンポーネント内に1つの他のサービス= Transient **が追加され、** IDisposable **エントリが追加されますコンテナのサービス内にある。 まだ基本クラスの機能が解決されていません。 – Vazmo

+0

あなたはwebapiを使用していますか?あなたはdependencyresolver/dependencyスコープのようなすべてのnececarry関連のものを実装していますか? Castle Windsorを使って基本的なサンプルを作成したら、https://github.com/tym32167/webapisample(特にglobal.asax.csとCoreフォルダはhttps://github.com/tym32167/webapisample/tree/master/)で確認してくださいsrc/Sample/Core) – tym32167

+0

ところで、コンストラクタ注入はプロパティ注入よりもはるかに優れています。なぜなら、すべての依存関係を1つの場所 - ctorの引数 - で見ることができます。解決の問題があれば、スタックトレース – tym32167

関連する問題