6

molto nuova per Structure-Map. cercando di capire come funziona e come posso trarne beneficio.Errore StructureMap: nessuna istanza predefinita definita per PluginFamily

ho ottenuto questo finora ..

Global.asax.cs:

IContainer container = new Container(x => 
    { 
     x.For<IControllerActivator>().Use 
       <StructureMapControllerActivator>(); 
     x.For<IUserRepo>().Use<UserRepo>(); 
    }); 

DependencyResolver.SetResolver(new StructureMapDependencyResolver(container)); 

StructureMapControllerActivator:

public class StructureMapControllerActivator : IControllerActivator 
{ 
    private readonly IContainer _container; 

    public StructureMapControllerActivator(IContainer container) 
    { 
     this._container = container; 
    } 

    public IController Create(RequestContext requestContext, Type controllerType) 
    { 
     return _container.GetInstance(controllerType) as IController; 
    } 
} 

StructreMapDependencyResolver:

private readonly IContainer _container; 

    public StructureMapDependencyResolver(IContainer container) 
    { 
     this._container = container; 
    } 

    public object GetService(Type serviceType) 
    { 
     object instance = _container.TryGetInstance(serviceType); 
     if(instance == null && !serviceType.IsAbstract) 
     { 
      _container.Configure(c => c.AddType(serviceType,serviceType)); 
      instance = _container.TryGetInstance(serviceType); 
     } 
     return instance; 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     return _container.GetAllInstances(serviceType).Cast<object>(); 
    } 
} 

mio AccountController:

public class AccountController : Controller 
{ 
    private readonly IUserRepo _userRepo; 

    private AccountController() 
    { 
     _userRepo = ObjectFactory.GetInstance<IUserRepo>(); 
    } 

    public ActionResult Login() 
    { 
     return View(); 
    } 
} 

Codice errore & Descrizione:

StructureMap Exception Code: 202 No Default Instance defined for PluginFamily MBP_Blog.Controllers.AccountController MBP-Blog, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

ho un nome di interfaccia: IUserRepo e un nome repository: UserRepo

prega aiutare a s Provo a google ma non trovo alcuna soluzione entro le prime 3 pagine.

Nuovo errore dopo aver usato @ il codice di Martin:

StructureMap Exception Code: 180 StructureMap cannot construct objects of Class MBP_Blog.Controllers.AccountController, MBP-Blog, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null because there is no public constructor found.

risposta

3

Estrarre la StructureMapControllerActivator, non credo ne avete bisogno. Se lo tieni, devi aggiungere una mappatura per il tuo AccountController.

Inoltre, l'iniezione di controllo, invece, renderà più semplice test delle unità:

public class AccountController : Controller 
{ 
    private readonly IUserRepo _userRepo; 

    public AccountController(IUserRepo userRepo) 
    { 
     _userRepo = userRepo; 
    } 

    public ActionResult Login() 
    { 
     return View(); 
    } 
} 

Inoltre ancora una volta, per il vostro contenitore, è possibile di default le mappature. Questo mapperà automaticamente IService a Service:

IContainer container = new Container(
      x => 
       { 
        x.Scan(scan => 
           { 
            scan.Assembly("MBP_Blog"); 
            scan.Assembly("MBP_Blog.Data"); 
            scan.WithDefaultConventions(); 
           }); 
       }); 
+0

@ Martin .. grazie per la vostra answer..i provato ad utilizzare il vostro method..but ancora sto ottenendo l'errore. per favore guarda l'errore aggiornato .. –

+0

SIAMO SPIACENTI !!! - Rendi pubblico il costruttore – Martin

+0

grazie ... in qualche modo l'ho fatto funzionare ... non so se è una buona pratica per il tuo aiuto..o lo uso o meno ... farò un'altra domanda su quello ... –

Problemi correlati