Зависимости Spring.NET не вводят - PullRequest
0 голосов
/ 11 января 2010

Я пытаюсь создать приложение 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>

Я бы предпочел использовать внедрение свойств, а не конструктор, но в настоящее время ни один из методов не работает.

Ответы [ 3 ]

3 голосов
/ 12 января 2010

Ну, оказалось, что ASP.NET MVC и Spring.NET просто не ладят ...

Однако пакет MvcContrib (фактически пакет Extras), похоже, решил проблему. Пакет имел реализацию фабрики Spring Controller, которая работала, и все было хорошо.

(Это напоминает мне попытку заставить Struts 1.X и Spring работать на стороне Java ...)

1 голос
/ 11 января 2010

в вашем загрузочном классе вы должны загрузить пружинный контейнер

ContextRegistry.getContext();

кстати вам нужно указать имя сборки для DepartmentDao

<object id="DepartmentDao" type="App.Data.DepartmentDao, App" />
0 голосов
/ 11 января 2010

Дополнительная информация: у меня также есть классы для SpringApplicationController и 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:

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();
        }
    } 
}

Я ссылаюсь на это в моем Global.asax следующим образом:

    protected void Application_Start()
    {

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


        RegisterRoutes(RouteTable.Routes);
    }
...