2010-09-07 9 views
0

J'ai une classe qui repose sur HttpServerUtilityBase mon plan était d'obtenir la carte de structure pour utiliser HttpServerUtilityWrapper comme instance par défaut. Rien d'étrange ici. Cependant, une fois que j'ai ajouté les déclarations à mon registre, structuremap est incapable de résoudre l'instance et j'obtiens une erreur 202.StructureMap ne trouve pas d'instance par défaut pour HttpServerUtility

Ceci est mon registre:

public class ApplicationRegistry : Registry 
{ 
    public ApplicationRegistry() 
    { 
     Scan(scanThe => 
     { 
      scanThe.AssembliesFromApplicationBaseDirectory(); 
      scanThe.WithDefaultConventions(); 
     }); 

     Scan(scanThe => 
     { 
      scanThe.AssemblyContainingType<HttpServerUtilityBase>(); 
     }); 

     SetAllProperties(x => 
     { 
      x.WithAnyTypeFromNamespaceContainingType<IFinancialYearRepository>(); 
      x.WithAnyTypeFromNamespaceContainingType<IUserManagementFacade>(); 
      x.WithAnyTypeFromNamespaceContainingType<IBulkTypeImporter>(); 
      x.OfType<ILog>(); 
      x.OfType<ISessionManager>(); 
     }); 

     For<IUnitOfWork>() 
      .HttpContextScoped() 
      .Use(() => new EFUnitOfWork(
        ConfigurationManager.ConnectionStrings["PublishedEFSqlServer"].ConnectionString 
        )).Named("publishedUnitOfWork"); 

     For<IUnitOfWork>() 
      .HttpContextScoped() 
      .Use(() => new EFUnitOfWork(
       ConfigurationManager.ConnectionStrings["UnpublishedEFSqlServer"].ConnectionString 
       )).Named("unpublishedUnitOfWork"); 

     For<ILog>() 
      .AlwaysUnique() 
      .Use(s => 
      { 
       ILog loggger; 
       if (s.ParentType == null) 
       { 
        loggger = LogManager.GetLogger(s.BuildStack.Current.ConcreteType); 
       } 
       else 
       { 
        loggger = LogManager.GetLogger(s.ParentType); 
       } 

       if (HttpContext.Current.User != null && HttpContext.Current.User.Identity.IsAuthenticated) 
       { 
        ThreadContext.Properties["user"] = HttpContext.Current.User.Identity.Name; 
       } 
       return loggger; 
      }); 

     For<ISessionManager>().Singleton(); 

     For<HttpServerUtilityBase>() 
      .Singleton() 
      .Use<HttpServerUtilityWrapper>(); 
    } 
} 

Tout cela me semble bien, mais clairement je manque quelque chose. Aussi la ligne de la générée en appelant WhatDoIHave() qui se réfère à HttpServerUtilityBase semble avoir une référence à HttpServerUtilityWrapper alors je suppose que cela devrait fonctionner.


HttpServerUtilityBase (System.Web.HttpServerUtilityBase) 3bf840df-e159-4dcf-93ef-211bb7484698 Configuré instance de System.Web.HttpServerUtilityWrapper, System.Web, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a
SCOPED comme: Singleton

Qu'est-ce que je manque?

+2

Pour votre information - vous n'avez pas besoin de scanner l'ensemble contenant HttpServerUtilityBase. La numérisation est uniquement utilisée pour enregistrer les types par convention. Dans ce cas, vous enregistrez explicitement le type HttpServerUtiltityBase, de sorte que l'analyse conventionnelle ne vous achète rien. –

Répondre

1

Il s'avère que le correctif est simple. Je dois préciser l'argument du constructeur pour la HttpServerUtilityWrapper

For<HttpServerUtilityBase>() 
    .Singleton() 
    .Use<HttpServerUtilityWrapper>() 
    .Ctor<HttpServerUtility>().Is(HttpContext.Current.Server); 
+0

Pour les ninjecteers:... 'kernel.Bind () ToConstant (HttpContext.Current.Server)' ' kernel.Bind () Pour () InSingletonScope(); ' –