par , 26/01/2016 à 12h02 (979 Affichages)
Pour utiliser Ninject dans un Worker Role, il faut tout d'abord installer 2 packages Nuget :
1 2
| Install-Package Ninject
Install-Package Ninject.Extensions.Azure |
Le code source du package Ninject.Extensions.Azure est disponible ici : https://github.com/ninject/Ninject.Extensions.Azure
Votre classe WorkerRole hérite par défaut de la classe abstraite Microsoft.WindowsAzure.ServiceRuntime.RoleEntryPoint. Il faut la modifier pour qu'elle hérite de la classe abstraite Ninject.Extensions.Azure.NinjectRoleEntryPoint :
1 2
| public class WorkerRole : NinjectRoleEntryPoint
{ } |
A ce stade, vous pouvez supprimer les méthodes OnStart et OnStop qui ne sont plus utilisables avec la classe NinjectRoleEntryPoint. Il faut les remplacer par les méthodes suivantes :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| /// <summary>
/// Déclenchée après la création du Kernel.
/// </summary>
protected override bool OnRoleStarted()
{ }
/// <summary>
/// Déclenchée pendant l'arrêt du Worker Role, avant que le Kernel ne soit disposé.
/// </summary>
protected override void OnRoleStopping()
{ }
/// <summary>
/// Déclenchée pendant l'arrêt du Worker Role, après que le Kernel ait été disposé.
/// </summary>
protected override void OnRoleStopped()
{ }
/// <summary>
/// Dans cette méthode vous devez créer le Kernel et charger les modules dont vous avez besoin.
/// </summary>
protected override IKernel CreateKernel()
{ } |
Au final, voici un exemple de Worker Role utilisant Ninject :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| public class WorkerRole : NinjectRoleEntryPoint
{
private readonly CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
private readonly ManualResetEvent runCompleteEvent = new ManualResetEvent(false);
private IKernel _kernel;
private IRepository _repository;
public override void Run()
{
Trace.TraceInformation("WorkerRole1 is running");
try
{
this.RunAsync(this.cancellationTokenSource.Token).Wait();
}
finally
{
this.runCompleteEvent.Set();
}
}
/// <summary>
/// Déclenchée après la création du Kernel.
/// </summary>
protected override bool OnRoleStarted()
{
// Set the maximum number of concurrent connections
ServicePointManager.DefaultConnectionLimit = 12;
// For information on handling configuration changes
// see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
bool result = base.OnStart();
Trace.TraceInformation("WorkerRole1 has been started");
this._repository = this._kernel.Get<IRepository>();
return result;
}
/// <summary>
/// Déclenchée pendant l'arrêt du Worker Role, avant que le Kernel ne soit disposé.
/// </summary>
protected override void OnRoleStopping()
{
}
/// <summary>
/// Déclenchée pendant l'arrêt du Worker Role, après que le Kernel ait été disposé.
/// </summary>
protected override void OnRoleStopped()
{
Trace.TraceInformation("WorkerRole1 is stopping");
this.cancellationTokenSource.Cancel();
this.runCompleteEvent.WaitOne();
base.OnStop();
Trace.TraceInformation("WorkerRole1 has stopped");
}
/// <summary>
/// Dans cette méthode vous devez créer le Kernel et charger les modules dont vous avez besoin.
/// </summary>
protected override IKernel CreateKernel()
{
this._kernel = new StandardKernel();
this._kernel.Bind<IRepository>().To<Repository>();
return this._kernel;
}
private async Task RunAsync(CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
{
Trace.TraceInformation("Working");
// La logique du Worker Role doit être mise ici :
var rep = this._repository.A();
}
}
} |