2014-09-29 16 views
5

Structuremap'i Bağımlılık Çözümleyicim olarak kullanıyorum. Global.asax.cs dosyamda Kapsayıcı Başına İstek Kalıbı'nı uygulamaya çalışıyorum. ObjectFactory olarak Structuremap IContainer örneği Asp.Net MVC 5 Bağımlılık Çözümleyicisi'nden nasıl edinilir

public IContainer Container 
    { 
     get 
     { 
      return (IContainer)HttpContext.Current.Items["_Container"]; 
     } 
     set 
     { 
      HttpContext.Current.Items["_Container"] = value; 
     } 
    } 


    public void Application_BeginRequest() 
    { 
     Container = ObjectFactory.Container.GetNestedContainer(); 
    } 

Ben DependencyResolver gelen konteyner erişmek istiyorum StructureMap gelecekteki sürümlerinde desteklenen edilmeyecektir. Bu nasıl mümkün olabilir?

Teşekkürler.

Noufal

cevap

3

I (CommonServiceLocator package yoluyla) ASP.NET MVC'ın Bağımlılık Çözücü ile StructureMap kaydedilmesi için bulabildiğim this was the best guide, bu soruya kendimi ran olması.

Yukarıdaki makalenin çözümünü kopyaladım ve yapıştırdım, ancak bu makalenin orijinal makalesinde sağladığı yararları gözden geçirmenizi öneririz.

public class StructureMapDependencyResolver : ServiceLocatorImplBase 
{ 
    private const string StructuremapNestedContainerKey = "Structuremap.Nested.Container"; 
    public IContainer Container { get; set; } 

    private HttpContextBase HttpContext 
    { 
     get 
     { 
      var ctx = Container.TryGetInstance<HttpContextBase>(); 
      return ctx ?? new HttpContextWrapper(System.Web.HttpContext.Current); 
     } 
    } 

    public IContainer CurrentNestedContainer 
    { 
     get { return (IContainer)HttpContext.Items[StructuremapNestedContainerKey]; } 
     set { HttpContext.Items[StructuremapNestedContainerKey] = value; } 
    } 

    public StructureMapDependencyResolver(IContainer container) 
    { 
     Container = container; 
    } 

    protected override IEnumerable<object> DoGetAllInstances(Type serviceType) 
    { 
     return (CurrentNestedContainer ?? Container).GetAllInstances(serviceType).Cast<object>(); 
    } 

    protected override object DoGetInstance(Type serviceType, string key) 
    { 
     var container = (CurrentNestedContainer ?? Container); 

     if (string.IsNullOrEmpty(key)) 
     { 
      return serviceType.IsAbstract || serviceType.IsInterface 
         ? container.TryGetInstance(serviceType) 
         : container.GetInstance(serviceType); 
     } 

     return container.GetInstance(serviceType, key); 
    } 

    public void Dispose() 
    { 
     if (CurrentNestedContainer != null) 
     { 
      CurrentNestedContainer.Dispose(); 
     } 

     Container.Dispose(); 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     return DoGetAllInstances(serviceType); 
    } 

    public void DisposeNestedContainer() 
    { 
     if (CurrentNestedContainer != null) 
      CurrentNestedContainer.Dispose(); 
    } 

    public void CreateNestedContainer() 
    { 
     if (CurrentNestedContainer != null) return; 
     CurrentNestedContainer = Container.GetNestedContainer(); 
    } 
} 

Sonra şöyle çözümleyicinizi ayarlayabilirsiniz:

public class MvcApplication : System.Web.HttpApplication 
{ 
    public static StructureMapDependencyResolver StructureMapResolver { get; set; } 

    protected void Application_Start() 
    { 
     ... 

     // Setup your Container before 
     var container = IoC.Initialize(); 
     StructureMapResolver = new StructureMapDependencyResolver(container); 
     DependencyResolver.SetResolver(StructureMapResolver); 
    } 

    protected void Application_BeginRequest(object sender, EventArgs e) 
    { 
     StructureMapResolver.CreateNestedContainer(); 
    } 

    protected void Application_EndRequest(object sender, EventArgs e) 
    { 
     StructureMapResolver.DisposeNestedContainer(); 
    }  
} 

yapılandırması bu tip büyük bir sonuç, konteyner sonunda imha edilir, istek başına yeni bir çocuk konteyneri almaya olduğunu her isteğin

1

Sadece bunu denedim ve çalışıyorum, lütfen en iyi yol değilse lütfen bana bildirin.

StructuremapMvc.StructureMapDependencyScope.Container 
0

iki bağımlılık çözücüler ASP.NET MVC için bir ve ASP.NET Web Api diğer vardır

Web Api: Kullanım WebApiContrib.IoC.StructureMap.StructureMapResolver

MVC : Kullanın StructureMapDependencyResolver

public class StructureMapDependencyResolver : StructureMapDependencyScope, IDependencyResolver 
{ 
    public StructureMapDependencyResolver(IContainer container) 
     : base(container) 
    { 
    } 

    public IDependencyScope BeginScope() 
    { 
     var child = Container.GetNestedContainer(); 
     return new StructureMapDependencyResolver(child); 
    } 
} 

public class StructureMapDependencyScope : ServiceLocatorImplBase, IDependencyScope 
{ 
    protected readonly IContainer Container; 

    public StructureMapDependencyScope(IContainer container) 
    { 
     if (container == null) 
     { 
      throw new ArgumentNullException(nameof(container)); 
     } 
     Container = container; 
    } 

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

    public override object GetService(Type serviceType) 
    { 
     if (serviceType == null) 
     { 
      return null; 
     } 
     return serviceType.IsAbstract || serviceType.IsInterface 
      ? Container.TryGetInstance(serviceType) 
      : Container.GetInstance(serviceType); 
    } 

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

    protected override IEnumerable<object> DoGetAllInstances(Type serviceType) 
    { 
     return Container.GetAllInstances(serviceType).Cast<object>(); 
    } 

    protected override object DoGetInstance(Type serviceType, string key) 
    { 
     if (string.IsNullOrEmpty(key)) 
     { 
      return serviceType.IsAbstract || serviceType.IsInterface 
       ? Container.TryGetInstance(serviceType) 
       : Container.GetInstance(serviceType); 
     } 
     return Container.GetInstance(serviceType, key); 
    } 
} 

Kullanımı aşağıdaki gibidir ...

public static class Ioc 
{ 
    public static void Config() 
    { 
     var container = InitializeContainer(); 

     var webApiDependencyResolver = new StructureMapResolver(container); 
     GlobalConfiguration.Configuration.DependencyResolver = webApiDependencyResolver; 

     var mvcDependencyResolver = new StructureMapDependencyResolver(container); 
     DependencyResolver.SetResolver(mvcDependencyResolver); 
    } 
} 

public class WebApiApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     Ioc.Config(); 
     ... 
    } 
} 
İlgili konular