2010-01-11 2 views
0

Spring.NET을 사용하여 종속성을 주입하는 ASP.NET MVC 응용 프로그램을 만들려고합니다. 응용 프로그램에는 컨트롤러, 서비스 및 데이터의 세 가지 계층이 있습니다.Spring.NET 종속성이 주입되지 않음

"~ \ Resources \ objects.xml"파일에 개체를 정의했습니다.

첫 번째 개체 인 UserAccountController에는 UserAccountService 및 DepartmentService라는 두 개의 서비스 계층 클래스가 필요합니다. 그래서, objects.xml의 정의는 다음과 같습니다

<object id="UserAccountController" type="App.Controllers.UserAccountController, App"> 
    <constructor-arg index="0" ref="DepartmentService" /> 
    <constructor-arg index="1" ref="UserAccountService" /> 
</object> 

<object id="UserAccountService" type="App.Service.UserAccountService, App"> 
    <property name="UserAccountDao" ref="UserAccountDao" /> 
</object> 

<object id="UserAccountDao" type="App.Data.UserAccountDao, App" /> 

<object id="DepartmentService" type="App.Service.DepartmentService, App"> 
    <property name="DepartmentDao" ref="DepartmentDao" /> 
</object> 

<object id="DepartmentDao" type="App.Data.DepartmentDao" /> 

Webconfig이 포함

<sectionGroup name="spring"> 
     <section name="context" type="Spring.Context.Support.WebContextHandler, Spring.Web"/> 
    </sectionGroup> 
</configSections> 
<spring> 
    <context> 
     <resource uri="~/Resources/objects.xml" /> 
    </context> 
</spring> 

내가 생성자보다는 부동산 주사를 사용하는 것을 선호하지만, 현재도 방법은 노력하고 있습니다. 나는 또한 SpringApplicationController 클래스를 가지고 : 당신의 bootstrapclass에

답변

3

글쎄, 그것은 밝혀졌다 ASP.NET MVC 및 Spring.NET 그 그냥 따라 가지 마세요 ...

그러나 MvcContrib 패키지 (실제로는 Extras 패키지)가 문제를 해결 한 것으로 보입니다. 이 패키지에는 스프링 컨트롤러 팩토리가 구현되어 모든 것이 만족 스러웠습니다.

(종류의 자바 측 스트럿츠 1.x 및 봄 작품을 만들려고 노력을 생각 나게 ...)

1

당신은 당신이 DepartmentDao

<object id="DepartmentDao" type="App.Data.DepartmentDao, App" /> 
+0

내가 실제로 SpringApplicationController 클래스와 봄 ControllerFactory 클래스가 있고, Global.asax에 그들을 참조 .cs : ControllerBuilder.Current.SetControllerFactory (typeof (App.Util.SpringControllerFactory))); 이 방법을 사용하는 경우 컨텍스트를 가져올 필요가 있습니까? – Jason

+0

솔직히, 나는 모른다. 그러나 분명히 아닙니다. Inversion of Control의 가장 좋은 방법은 응용 프로그램 시작시 컨테이너를로드하고 컨테이너에 대한 다른 참조가없는 경우입니다. 구성이 잘 수행되면 ContextRegistry.getContext(); 모든 것을 다 처리해야한다. – Fabiano

+0

좋아, ContentRegistry.getContext()에 대한 간단한 호출을 위해 멋진 ControllerFactory 및 ApplicationContext 구현을 덤프하고 web.config의 일반 ContextHandler로 다시 전환했다. 아직도 주사에 운이 없다. – Jason

0

자세한 내용은 어셈블리 이름을 지정해야하는 방식으로 스프링 컨테이너를

ContextRegistry.getContext(); 

을로드해야 SpringControllerFactory :

SpringApplicationController.cs :

public static class SpringApplicationContext 
{ 
    private static IApplicationContext Context { get; set; } 

    /// <summary> 
    /// Returns a boolean value if the current application context contains an named object. 
    /// </summary> 
    /// <param name="objectName">Accepts the name of the object to check.</param> 
    public static bool Contains(string objectName) 
    { 
     SpringApplicationContext.EnsureContext(); 
     return SpringApplicationContext.Context.ContainsObject(objectName); 
    } 

    /// <summary> 
    /// Return a instance of an object in the context by the specified name. 
    /// </summary> 
    /// <param name="objectName">Accepts a string object name.</param> 
    public static object Resolve(string objectName) 
    { 
     SpringApplicationContext.EnsureContext(); 
     return SpringApplicationContext.Context.GetObject(objectName); 
    } 

    /// <summary> 
    /// Return a instance of an object in the context by the specified name and type. 
    /// </summary> 
    /// <typeparam name="T">Accepts the type of the object to resolve.</typeparam> 
    /// <param name="objectName">Accepts a string object name.</param> 
    public static T Resolve<T>(string objectName) 
    { 
     return (T)SpringApplicationContext.Resolve(objectName); 
    } 

    private static void EnsureContext() 
    { 
     if (SpringApplicationContext.Context == null) 
     { 
      SpringApplicationContext.Context = ContextRegistry.GetContext(); 
     } 
    } 
} 

SpringControllerFactory.cs 다음과 같이 내 Global.asax에이를 참조

public class SpringControllerFactory : DefaultControllerFactory 
{ 
    public IController CreateController(RequestContext context, Type controllerType) 
    { 
     IResource input = new FileSystemResource(context.HttpContext.Request.MapPath("Resource\\objects.xml")); 
     IObjectFactory factory = new XmlObjectFactory(input); 

     return (IController) factory.GetObject(controllerType.Name); 
    } 

    public IController CreateController(RequestContext context, string controllerName) 
    { 
     IController controller = null; 
     string controllerClassName = string.Format("{0}Controller", controllerName); 

     if (SpringApplicationContext.Contains(controllerClassName)) 
     { 
      controller = SpringApplicationContext.Resolve<IController>(controllerClassName); 
      this.RequestContext = context; 
     } 
     else 
     { 
      controller = base.CreateController(context, controllerName); 
     } 
     return controller; 
    } 

    public override void ReleaseController(IController controller) 
    { 
     IDisposable disposable = controller as IDisposable; 
     if (disposable != null) 
     { 
      disposable.Dispose(); 
     } 
    } 
} 

:

protected void Application_Start() 
    { 

     ControllerBuilder.Current.SetControllerFactory(typeof(App.Util.SpringControllerFactory)); 


     RegisterRoutes(RouteTable.Routes); 
    } 
+0

여기서 IApplicationContext Context는 SpringApplicationContext에 설정되어 있습니까? – Fabiano