2012-09-05 30 views
5

Denetleyicideki nesne çalışma zamanında enjekte edilmiyor.Spring .NET ile MVC denetleyicisine bağımlılığı enjekte etme

Web.config:

<sectionGroup name="spring"> 
     <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core" /> 
     <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" /> 
    </sectionGroup> 

. . .

<!-- Spring Context Configuration --> 
<spring> 
    <context> 
     <resource uri="config://spring/objects"/> 
    </context> 
    <objects configSource="App_Config\Spring.config" /> 
</spring> 
<!-- End Spring Context Configuration --> 

Spring.config:

<?xml version="1.0" encoding="utf-8" ?> 
<objects xmlns="http://www.springframework.net"> 

    <!-- Crest is the WCF service to be exposed to the client, could not use a singleton --> 

    <object id="TestController" type="Project.Controllers.TestController, Project" singleton="false"> 
     <property name="ObjectA" ref="ObjectImpl"/> 
    </object> 

    <object id="ObjectImpl" type="Project.Code.Implementations.ClassA, Project" singleton="false" /> 

</objects> 

TestController:

public class TestController: Controller 
    { 
     // this object will be injected by Spring.net at run time 
     private ClassA ObjectA { get; set; } 

Sorun: Çalışma zamanında

ObjectA enjekte ve boş kalır almaz, nedeni kod boyunca null istisnası.

Alternatif: Spring nesnesini el ile başlatabilir ve aşağıdaki kodu kullanarak nesne alabilirim.

 var ctx = ContextRegistry.GetContext(); 
     var objectA = ((IObjectFactory)ctx).GetObject("ObjectImpl") as ClassA; 
+1

Bulmacanın bazı parçalarını kaçırıyorsunuz. Lütfen [burada] (http://foldingair.blogspot.hu/2010/01/springnet-and-aspmvc-getting-started.html) ve ayrıca [burada] (http://www.springframework.net) bir göz atın. /doc-latest/reference/html/web-mvc.html) ve [burada] (http://nuget.org/packages/Spring.Web.Mvc/1.3.2). – nemesv

+0

@nemesv evet doğru, bulmacanın bir parçasını kaçırıyordum. Teşekkürler! –

cevap

3

MVC için Spring Implementation uygulamasının oldukça önemli bir bölümünü kaçırdığım ortaya çıkıyor.

Benim sorunumdaki çözüm, IDependencyResolver'ı uygulayan bir DependencyResolver eklenmesiydi.

DependencyResolver:

public class SpringDependencyResolver : IDependencyResolver 
{ 
    private readonly IApplicationContext _context; 

    public SpringDependencyResolver(IApplicationContext context) 
    { 
     _context = context; 
    } 

    public object GetService(Type serviceType) 
    { 
     var dictionary = _context.GetObjectsOfType(serviceType).GetEnumerator(); 

     dictionary.MoveNext(); 
     try 
     { 
      return dictionary.Value; 
     } 
     catch (InvalidOperationException) 
     { 
      return null; 
     } 
    } 

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

Global.asax.cs: Eğer cevap önermek gibi

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 

     DependencyResolver.SetResolver(new SpringDependencyResolver(ContextRegistry.GetContext())); 
    } 
+0

Bu işe yaramaz, içerik oluşturulmakta ve 'ContextRegistry.GetContext()' bir istisna atar! – Tobias

1

Sen, kendi IDependencyResolver uygulayabilirsiniz. Unutmayın ki (iirc) sürüm 1.3.1 Spring.NET, asp.net mvc 2.0 ve 3.0 için yerleşik desteğe sahiptir. Spring.net 2.0 (pre release available on NuGet) sürüm 4.0 için de destek sağlamıştır. Bunun yerine bu kütüphaneleri kullanmayı düşünün.

SpringDependencyResolver ürününü the one provided by the Spring.net team ile karşılaştırmak isteyebilirsiniz.

+0

Öneri için teşekkürler @Marijn. Spring.NET yerleşik desteğiyle haklısınız. Fakat bizim durumumuzdaki problem, MVC4 framework'ü kullanıyor olduğumuz ve Spring.net 2.0'in henüz üretim sürümüne hazır olmadığıdır. Böylece özel bir uygulama durumumuz için daha iyi uyuyor. DependencyResolver [Spring tarafından sağlanan] 'a bir göz atacağım (https://fisheye.springsource.org/browse/spring-net/src/Spring/Spring.Web.Mvc4/SpringMvcDependencyResolver.cs?hb=true), Teşekkürler! –

+0

Spring tarafından sağlanan bağımlılık çözümleyicisini kullanmaya çalıştım ancak Global.asax (MvcApplication kaynağından devralınan yöntem inititing) "DependencyResolver.SetResolver (yeni SpringDependencyResolver (ContextRegistry.GetContext())), "bağlamın hala oluşturma aşamasında olduğunu söyleyen bir hata atar. Benim durumumda neyin yanlış olduğuyla ilgili bir fikriniz var mı?" –

İlgili konular