2017-04-11 2 views
0

J'ai créé un wrapper d'unité de travail pour mes méthodes d'accès aux données Nhibernate. J'initialise ma session Factory dans le constructeur statique de la classe UnitOfWork, en espérant la faire initialiser une seule fois.Création d'une dépendance ninject avec le constructeur statique

public class UnitOfWork : IUnitOfWork 
{ 
    private static readonly ISessionFactory _sessionFactory; 
    static UnitOfWork() 
    { 
     var oracleConfiguration = OracleDataClientConfiguration.Oracle10.ConnectionString(ConfigurationManager.ConnectionStrings[Constants.CONNECTION_STRING].ConnectionString); 
     _sessionFactory = Fluently.Configure() 
          .Database(oracleConfiguration) 
          .Mappings(m => m.FluentMappings.Add<MyMap>()) 
          .BuildSessionFactory(); 
    } 
} 

Je lie alors cette dépendance de UnitOfWork avec Ninject noyau lors de mon démarrage de l'application et attendre ensuite Ninject de le résoudre dans le constructeur de mon accès aux données du référentiel. (J'utilise l'injection Constructor).

public class Module : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IUnitOfWork>().To<UnitOfWork>(); 
    }                  
} 

Mais après la résolution, je pourrais comprendre que le code dans le constructeur statique n'a jamais été exécuté lors de la création d'objets et par conséquent mon usine Nhibernate session est nulle.

Je suis sûr qu'il me manque quelque chose ici. Quelqu'un pourrait m'aider à comprendre quelle est la bonne façon d'utiliser le constructeur statique dans Ninject?

Merci

+0

Vous n'avez pas besoin de définir votre unité de travail statique. Il devrait fonctionner sans mot-clé statique – OrcusZ

+0

Si je ne le mets pas en statique, avec ma configuration de liaison Ninject actuelle, il en résulterait que le CIO Ninject crée des fabriques de session séparées pour chaque résolution. – Dinny

Répondre

1

Vous voulez que votre constructeur UOW à exécuter une seule fois, donc vous déclarer statique. Pourquoi pas, mais il ne devrait pas compiler avec un modificateur d'accès (le mot-clé public). Le constructeur statique n'accepte pas les modificateurs d'accès (ou arguments). Etes-vous sûr que votre code est valide?

Je suppose que vous avez réellement essayé sans le modificateur d'accès invalide.

Je ne sais pas comment un type pourrait être utilisé sans déclencher d'abord son constructeur statique. Peut-être que NInject est capable de le faire. Dans ce cas, revenez simplement dans une solution plus propre: ajoutez votre fabrique de sessions à NInject avec un cycle de vie singleton et un code approprié pour l'instancier (en gros ce que votre constructeur Uow actuel fait) et configurez votre Uow pour l'avoir comme dépendance.

+0

Mon mauvais, j'ai tapé le code moi-même dans la question et j'ai oublié le modificateur d'accès dans mon constructeur statique. Je vais le corriger maintenant. J'ai essayé votre suggestion et cela a fonctionné comme prévu. Ma liaison est "Lier () .Pour () .InSingletonScope();" et j'ai changé mon constructeur statique en constructeur d'instance publique. Merci :) – Dinny

+0

@Dinny c'est la culture de voter/évaluer les réponses à votre question, vous devez en particulier accepter la meilleure réponse en fait répondre à votre question et il est également fréquent de voter sur les autres réponses. Voir aussi http://stackoverflow.com/help/accepted-answer – BatteryBackupUnit