2010-05-14 24 views
8

Ich habe eine Schnittstelle IGenericRepository<TEntity> where TEntity : IEntity und eine Implementierung GenericRepository<TEntity> where TEntity : Entity.Wie konfiguriere ich StructureMap, um ein generisches Repository zu verwenden?

Ich versuche, eine bestimmtes IGenericRepository<Section> in eine Klasse mit StructureMap zu injizieren:

ObjectFactory.Initialize(x => 
     { 
      x.For(typeof(IGenericRepository<>)).Use(typeof(GenericRepository<>)); 
     }); 

Aber wenn ich versuche ObjectFactory.GetInstance<IGenericRepository<Section>>(); zu verwenden, erhalte ich:

StructureMap Ausnahmecode: 202 Keine Standardinstanz definiert für PluginFamily System.Data.Common.DbConnection

Irgendwelche Ideen, warum das ist oder was ich falsch mache?

Vielen Dank im Voraus,

Simon

Antwort

3

Was ist Ihr Konstruktor wie für GenericRepository<>?

Es oder eine seiner Abhängigkeiten erwartet eine DbConnection, die SM nicht erstellen kann.

+0

Danke dafür, mein generisches Repository nimmt einen ObjectContext, den ich nicht durch SM hinzugefügt habe – simonjreid

+0

Ist das eine Antwort oder eine andere Frage? Wenn es eine Frage ist, warum ist es als die akzeptierte Antwort markiert? –

8

Sie erhalten im Konstruktor von GenericRepository eine DbConnection, die eine abstrakte Klasse ist, und konfigurieren SM nicht, um zu wissen, welche spezifische Klasse dafür verwendet werden soll.

dh:

ObjectFactory.Initialize(x => 
     { 
      x.For(typeof(DbConnection)).Use(typeof(SqlConnection)); 
      x.For(typeof(IGenericRepository<>)).Use(typeof(GenericRepository<>)); 
     }); 
4

hatte ich genau dieses gleiche Problem:

Haben Sie eine generische Repository:

public interface IRepository<TEntity> : IDisposable where TEntity : class 
    { } 

und eine konkrete Umsetzung:

public class Repository<TEntity> : IRepository<TEntity> where TEntity : class 
    { } 

die i wollte spritzen ed in den Konstruktor des Controller zur Laufzeit, wo die TEntity das Modell relevant, dass die Steuerung würde:

public FooBarController(IRepository<FOO_BAR_TYPE> repository) 
     { 
      _repo = repository; 
     } 

der Controller würde dann Repository „_repo“ verwendet das Modell zu aktualisieren:

// 
// POST: /EmergencyServiceType/Create 
[HttpPost] 
public ActionResult Create(FOO_BAR_TYPE foobar) 
{ 
    if (ModelState.IsValid) 
    {    
     // GetNextSequenceValue() deals with Oracle+EF issue with auto-increment IDs 
     foobar.FOO_BAR_ID = _repo.GetNextSequenceValue(); 
     _repo.Add(foobar); 
     _repo.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    return View(foobar); // display the updated Model 
} 

simonjreid Die Antwort für mich war: Ich musste den ObjectContext zur StructureMap-Konfiguration hinzufügen (der Zweck des Repositories war es, den von EntityFramework generierten Kontext, den ich MyContextWrapper nannte, zu schließen).Deshalb, weil das Repository auf MyContextWrapper angewiesen, die auf Object wiederum hängt):

// This avoids 'No Default Instance for ...DbConnection' exception 
x.For<System.Data.Objects.ObjectContext>().Use<MyContextWrapper>(); 
x.For<System.Web.Mvc.IController>().Use<Controllers.FooBarController>().Named("foobarcontroller"); // note that Named is required and is Case Sensitive 

Aber jetzt bekomme ich die StructureMap Laufzeit Ausnahme:

StructureMap Ausnahmecode: 205 Fehlende angeforderte Instanz Eigenschaft " connection“

einen Beitrag von Jeremy Miller A Gentle Quickstart (rechts unten) nach der Lektüre fand ich, dass Sie definieren können, welche Argumente in t passieren er Konstruktor Ihrer registrierten Typen, dh i der MyCustomContext Klasse in der Connection String an den Konstruktor übergeben erforderlich (hier ist die vollständige Liste der, wie ich bin der Initialisierung des Object:

string connStr = System.Configuration.ConfigurationManager.ConnectionStrings["MyContextWrapper"].ConnectionString; 
ObjectFactory.Initialize(x => 
      { 
       x.Scan(scan => 
         { 
          // Make sure BUSINESS_DOMAIN assembly is scanned 
          scan.AssemblyContainingType<BUSINESS_DOMAIN.MyContextWrapper>(); 
          scan.TheCallingAssembly(); 
          scan.WithDefaultConventions(); 
         }); 
       // 'connStr' below is a local variable defined above 
       x.For<System.Data.Objects.ObjectContext>() 
        .Use<MyContextWrapper>() 
        .Ctor<string>().Is(connStr); 
       x.For<System.Web.Mvc.IController>().Use<Controllers.FooBarController>().Named("foobarcontroller"); 
      }); 

Und BOOM! Kann jetzt meinen Controller zur Laufzeit von StructureMap instantiiert haben und ihn dazu bringen, eine Instanz von IRepository ... Happy Days zu injizieren.

+0

+1: Danke, Mann. Ich hatte das gleiche Problem. –

Verwandte Themen