複数のアセンブリに分割されたアプリケーションに取り組んでいます。各アセンブリは外界へのインターフェイスを提供し、インスタンスは Ninject ベースのファクトリを介して生成されます。
まあ、Code があります。これは実行中のアセンブリからのものです。
public class IsolationTestModule : NinjectModule
{
public override void Load()
{
ServiceFactory sf = new ServiceFactory();
Bind<IService>().ToMethod(context=>sf.CreatService()).InSingletonScope();
}
}
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
IKernel kernel = new StandardKernel(new IsolationTestModule());
IService service = kernel.Get<IService>();
}
}
ServiceFactory
も に依存してNinject
いますが、独自のKernel
と独自のがありModule
ます。
public interface IService
{
void Idle();
}
public interface IDependantService
{
void IdleGracefully();
}
public class ServiceImpl : IService
{
[Inject]
public IDependantService DependantService { get; set; }
public void Idle()
{
DependantService.IdleGracefully();
}
}
public class DependantServiceImpl : IDependantService
{
public void IdleGracefully() { }
}
public class ServiceFactory
{
private IKernel _kernel = new StandardKernel(new SuppliesModule());
public IService CreatService()
{
return _kernel.Get<IService>();
}
}
public class SuppliesModule : NinjectModule
{
public override void Load()
{
Bind<IService>().To<ServiceImpl>().InSingletonScope();
Bind<IDependantService>().To<DependantServiceImpl>().InSingletonScope();
}
}
実際に何が起こるか: -instanceServiceFactory
のビルドが完了するまでは問題ありません。ServiceImpl
次のステップでは、アプリケーション は依存関係kernel
を解決しようとしますが、もちろん、例外で失敗します (バインディングが利用できず、型は自己バインド可能ではありません)。私の理解では、ファクトリのカーネルがそれを行う必要があります...実際、Ninjectがすぐに作成されなかったインスタンスでも依存関係を解決することに熱心であることを知りませんでした。これは確かに私に新しい地平を開きます;-)ServiceImpl
IsolationTestModule
IDependantService
これを一時的に解決するために、ServiceImpl
以下に示すように、コンストラクター ベースのインジェクションに変更します。
public class ServiceImpl : IService
{
public IDependantService DependantService { get; set; }
[Inject]
public ServiceImpl(IDependantService dependantService)
{
DependantService = dependantService;
}
public void Idle()
{
DependantService.IdleGracefully();
}
}
それでも、インジェクション戦略の変更を強制しないソリューションを希望します。インジェクションチェーンを分離する方法を知っている人はいますか?