2017-03-29 2 views
1

Ich versuche UNITY in meiner WebApi2-Anwendung zu implementieren. Das Problem ist, dass ich eine vorhandene SqlConnection verwenden, abhängig von einer Kennung in der URL der Ressource gefunden. Also ich brauche die Kennung in der Anfrage uri zur Verfügung gestellt, um meinen Kontext mit zu erstellen. Ist es möglich, {dbIdentifier} aus dem Anforderungs-URI abzurufen und in den Konstruktor von MyRepo zu parsen?Web API OWIN Host mit Unity

Der Antrag usi aussehen wird:/api/{dbIdentifier}/{Controller}/{id}

Die Struktur sieht aus wie ...

Request POST /api/myDbIdentifier/my/ + PAYLOAD data 

Controller: 
public class MyController : ApiController 
{ 
    private readonly IRepo _repo; 

    public MyController(IRepo repo) 
    { 
     _repo = repo; 
    } 
} 

Repo: 
public class MyRepo : IRepo 
{ 
    private readonly MyContext _context; 

    public MyRepo(string dbIdentifier) 
    { 
     _context = new MyContext(GetConnection(dbIdentifier)); 
    } 

    public void Insert(string s) 
    { 
     //Inserting string in context and save changes 
    } 

    private DbConnection(string id) 
    { 
     //psudo find connecion from pool, and return instance of DbConnection... 
    } 
} 

public interface IRepo 
{ 
    void Insert(string s); 
} 

Context: 
public class MyContext : DbContext 
{ 
    public MyContext(DbConnection exitingConnection) : base(existingConnection, true) 
    { } 
} 

Btw, es ist mein erstes Mal spielen herum mit WebApi und Unity, also bitte ertragen mit meiner Ignoranz.

AKTUALISIERT Unity Teil meines Codes ...

UnityResolver (aus https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/dependency-injection):

public class UnityResolver : IDependencyResolver 
{ 
    protected IUnityContainer Container; 

    public UnityResolver(IUnityContainer container) 
    { 
     if (container == null) 
     { 
      throw new ArgumentNullException(nameof(container), "Please provider an IUnityContainer."); 
     } 
     Container = container; 
    } 

    public void Dispose() 
    { 
     Container.Dispose(); 
    } 

    public object GetService(Type serviceType) 
    { 
     try 
     { 
      return Container.Resolve(serviceType); 
     } 
     catch (ResolutionFailedException) 
     { 
      return null; 
     } 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     try 
     { 
      return Container.ResolveAll(serviceType); 
     } 
     catch (Exception) 
     { 
      return new List<object>(); 
     } 
    } 

    public IDependencyScope BeginScope() 
    { 
     return new UnityResolver(Container.CreateChildContainer()); 
    } 
} 

Unity Register Teil in meinem Start:

public static void Register(HttpConfiguration config) 
{ 
    // Configuring DI Container fo IoC (Invert of Control) 
    var container = new UnityContainer(); 
    container.RegisterType<IRepo, MyRepo>(new HierarchicalLifetimeManager()); 
    config.DependencyResolver = new UnityResolver(container); 
} 

Antwort

1

Sie können folgende versuchen :

1) Erstellen Sie eine DelegatingHandler, wo Sie acc ess HtppRequestMessage.RequestUri

2) Extrahieren von dbIdentifier Uri

3) Wrap dbIdentifier mit einer Klasse (z.B. DbIdentifier) ​​und registrieren sie in Einheit mit HierarchicalLifetimeManager

4) Denken Sie daran, Handler in owin registrieren:

httpConfiguration.MessageHandlers.Add(new DbIdentifierHandler()); 

EDIT. Sie können in diesem Beitrag schauen, um einige Inspiration zu finden: How to pass Owin context to a Repo being injected into Api controller

Verwandte Themen