문제

ASP.NET MVC에서 Spring.net IOC 기능을 사용하는 데모를 작업하고 있습니다. www.asp.net 사이트의 쌍 프로그래밍 비디오 자습서에 제공된 MyBlog 응용 프로그램과 비슷합니다. Microsoft의 Unity Framework를 사용하여 동일한 데모를 완료했으며 이제 Spring 컨테이너를 시험해 보려고합니다. 이를 위해 나는 먼저 스프링 객체 공장을 만들어내는 간단한 아이콘 트롤로 포장을 구현했습니다.

IObjectFactory factory;
(....)
factory = new XmlObjectFactory(new FileSystemResource(application.Server.MapPath("objects.xml")))

다음으로 해당 공장에서 컨트롤러를 가져옵니다.

public IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName) {
    IController result = context.GetObject(controllerName) as IController;
    return result;
}

(단순화 목적으로 오류 처리가 제거되었습니다).

이제 홈 컨트롤러 어딘가에 이런 종류의 행동이 있습니다.

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult AddEntry([Bind] BlogEntry entry, int id) {
    entry.EntryDate = DateTime.Now;
....

다음은 addentry.aspx view의 일부가 있습니다. 항목 매개 변수의 편집기를 정의합니다 (실제 기본 사항).

<form method="post" action="/Home/AddEntry/<%= ViewData["id"] %>">
    <table>
        <tr>
            <td><label for="Title">Title</label></td>
            <td><input name="entry.Title" type="text"/></td>
        </tr>
        <tr>
            <td><label for="Text">Content</label></td>
            <td><input name="entry.Text" type="text"/></td>
        </tr>
    </table>
    <br />
    <input type="submit" value="Add entry" />
    <input type="button" value="Cancel" onclick="history.back(-1);" />
</form>

이제 거래가 있습니다. Unity IOC를 사용하면 매력처럼 작동합니다. "ENTERT"매개 변수는 내 형태와 라인과 같이 내 형태에서 사산화됩니다.

entry.EntryDate = DateTime.Now; 

문제없이 완료됩니다.

그러나 Spring.net Object Factory (위에서 설명한 것처럼)로 전환하면 상황이 견고하게 시작됩니다. 우선 매개 변수 "항목"이 NULL을 돌리면 예외가 발생합니다. 내 최종 문제를 추적하기 위해 나는 다음과 같은 모습의 일종의 사용자 정의 ImodelBinder를 구현했습니다.

public class BlogEntryBinder : IModelBinder {
    public ModelBinderResult BindModel(ModelBindingContext bindingContext) {
        ModelBinderResult result = ModelBinders.DefaultBinder.BindModel(bindingContext);
        return result;
    }
}

Unity Framework를 사용하여 여기에 와서 BindingContext에서 httprequest로 드릴 다운하면 request.httpmethod가 "post"이고 request.form이 올바르게 채워집니다. Spring.net을 사용하여 동일하게 수행하면 메소드는 "get"이고 request.form이 비어 있습니다. 그러나 컨트롤러 조치 (Addentry)로 나아가서 두 상황 모두에서 요청으로 드릴로 내려 가면 request.httpmethod 및 request.form에 적절한 값이 있음을 알 수 있습니다.

이제 문제는 Spring.net으로 버전을 수정하여 Unity 프레임 워크를 사용하는 것과 같이 작동합니까?

도움이 되었습니까?

해결책

답을 찾았습니다!

내 객체 정의는 다음과 같이 보였습니다.

<!-- Controlers -->
<object name="Home" type="MyBlog.Controllers.HomeController">
    <property name="BlogService" ref="BlogService" />
    <property name="BlogEntryService" ref="BlogEntryService" />
    <property name="BlogEntryCommentService" ref="BlogEntryCommentService" />
</object>

실제로하는 속성을 설정하지 않는 것은 실제로하는 일을 사용 하여이 개체를 요청할 때마다 동일한 인스턴스를 반환한다는 것입니다.

IController result = context.GetObject(controllerName) as IController;

그래서 내가 정의를 변경했을 때

<!-- Controlers -->
<object name="Home" type="MyBlog.Controllers.HomeController" singleton="false">
    <property name="BlogService" ref="BlogService" />
    <property name="BlogEntryService" ref="BlogEntryService" />
    <property name="BlogEntryCommentService" ref="BlogEntryCommentService" />
</object>

모든 것이 시작되었습니다.

안부, Matthias.

다른 팁

이 동작을 명확히하기위한 추가 메모 : 컨트롤러는 ASP.NET MVC 프레임 워크에 의해 프로토 타입으로 취급되지만 스프링 기본값은 싱글 톤 모드에 대한 기본값입니다. 따라서 컨테이너 구성에서 객체를 비 싱글 톤으로 명시 적으로 표시해야합니다. 다가오는 Spring MVC 통합 모듈이이를 처리 할 것이므로이를 해결하지 못할 것입니다.

HTH, 에리히

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top