J'ai un projet très similaire (sauf que je n'utilise pas Caliburn) et j'ai essayé de comprendre comment faire cela aussi. J'ai trouvé une méthode qui fonctionne bien pour l'injection de constructeur en utilisant la méthode InScope() de Ninject.
J'ai une classe statique appelée IoC qui enveloppe l'accès au noyau de Ninject. Puisque les dépendances sont toutes injectées dans le constructeur, le contexte n'est pertinent que lorsque l'objet est créé. Donc ce n'est pas important ce qui est fourni pour le contexte, mais un Guid se sent comme le choix sûr. Program.OpenSession() est une méthode statique pour ouvrir une nouvelle ISession.
public static class Ioc
{
private static readonly IKernel _kernel;
static IoC()
{
_kernel = new StandardKernel();
_kernel.Load(new ContextModule());
}
private static object _context;
public static T ResolveInContext<T>(object context)
{
_context = context;
var result = _kernel.Get<T>();
_context = null;
return result;
}
private class ContextModule : NinjectModule
{
public override void Load()
{
Bind<ISession>().ToMethod(x => Program.OpenSession()).InScope(x => _context);
Bind<frmCompanyViewer>().ToSelf().InScope(x => _context);
}
}
}
utilisation est la suivante:
var frm = IoC.ResolveInContext<frmCompanyViewer>(Guid.NewGuid());
signature du constructeur de la forme est la suivante:
public frmCompanyViewer(ISession session, ICompanyRepository companyRepository)
I vérifié que avec InScope sur les liaisons, le même ISession qui est utilisé pour construire frmCompanyViewer est également utilisé pour construire companyRepository. Si j'enlève InScope, deux ISessions sont utilisées.
Modifié pour ajouter: Cela fonctionnerait également, voir les commentaires.Cela devrait être rendu sûr pour une application réelle. J'ai changé le nom de la méthode en ConstructInContext
pour clarifier que le contexte s'applique uniquement pendant la construction de l'objet.
public static T ConstructInContext<T>()
{
_context = Guid.NewGuid();
var result = _kernel.Get<T>();
_context = null;
return result;
}
Qu'est-ce que IScreen? –
IScreen est l'interface de base des modèles de vue à Caliburn – Mike