سؤال

لدي بعض الأسئلة بخصوص GWT-Dispatch و Guice. أنا أستخدم Guice 2.0 و GWT-Dispatch 1.1.0 لقطة و MVP4G 1.1.0 و GIN 1.0

بادئ ذي بدء ، لقد حددت الإجراءات والنتيجة والمعالج البسيطة:

ListContactSaction.java

public class ListContactsAction implements Action<ListContactsResult>{

    public ListContactsAction() {
    }

}

ListContactSresult.java

public class ListContactsResult implements Result {

    private List<Contact> contactList;

    public ListContactsResult() {
    }

    public ListContactsResult(List<Contact> contactList) {
        this.contactList = contactList;
    }

    public List<Contact> getContactList() {
        return contactList;
    }
}

ListContactshandler.java

public class ListContactsHandler implements ActionHandler<ListContactsAction, ListContactsResult>{

    @Inject
    private SqlSessionFactory factory;

    public Class<ListContactsAction> getActionType() {
        return ListContactsAction.class;
    }

    public ListContactsResult execute(ListContactsAction a, ExecutionContext ec) throws DispatchException {
        // some code using SqlSessionFactory and returning ListContactResult
        // with list of contacts
    }

    public void rollback(ListContactsAction a, ListContactsResult r, ExecutionContext ec) throws DispatchException {
        /* get action - no rollback needed */
    }

}

في الإصدار السابق من تطبيقي ، الذي كان يستخدم خدمة RPC بدلاً من نمط الأوامر ، كان لدي طريقة كانت توفر SqlSessionFactory للحقن ، شيء من هذا القبيل:

@Provides
    public SqlSessionFactory getSqlSessionFactory(){
        // some code here
    }

قرأت في بدء تشغيل GWT-Dispatch الذي يجب أن أقدمه بين عملي ومعالجه ، والذي يجب أن يبدو شيئًا كهذا:

public class ContactModule extends ActionHandlerModule{
    @Override
    protected void configureHandlers() {
        bindHandler(ListContactsAction.class, ListContactsHandler.class);
    }
}

لكن لدي مشكلة في توصيل كل شيء مع Guice ، لأن هذا المثال من موقع GWT-Dispatch:

public class DispatchServletModule extends ServletModule {
    @Override
    public void configureServlets() {
        serve( "/path/to/dispatch" ).with( DispatchServiceServlet.class );
    }
}

لا يعمل ، لأنه لا يوجد DispatchServiceServlet في حزمة.

أسئلتي هي:

  • كيف يجب أن أكتب DispatchServletModule وكيفية جعلها مستمرة (مع ما يجب أن أخدمه)
  • ما الذي يجب أن أضعه في ملف web.xml لتطبيقي لتتمكن من تنفيذ الإجراءات بشكل صحيح من مقدم العرض الخاص بي ، والذي تم حقنه جين DispatcherAsync تطبيق
  • أين يجب أن أضع بلدي SqlSessionFactory توفير طريقة (في الوحدة النمطية) لتكون قادرة على حقن SQLSessionFactory حيث أحتاج إليها
  • كيف أقوم بتثبيت الحاقن ، لذا يمكنني استخدامه في معالجات الإجراءات الأخرى بشكل صحيح

أعتقد أن هذا كل شيء وجعلت نفسي واضحًا. إذا لم يكن هناك شيء واضح بما فيه الكفاية ، سأحاول أن أكون أكثر تحديدًا.

لا يوجد حل صحيح

نصائح أخرى

هل قمت بإنشاء فئة guiceservletconfig؟ هذا هو المكان الذي تقوم فيه بإعداد وحدة Servlet الخاصة بك بالإضافة إلى وحدة معالج الإجراء الخاصة بك مع Guice.

plubic class GuiceServletConfig extends GuiceServletContextListener {
    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new HandlerModule(), new DispatchServletModule());
    }
}

HandlerModule هي فئة وحدة ActionHandler الخاصة بك ، لذلك من الكود الخاص بك سوف تضع فئة ContactModule الخاصة بك.

بالنسبة إلى SQLSessionFactory ، يمكنك إعداد الربط له في ContactModule ، مع الكود الخاص بي ، لدي فقط وحدة خادم واحدة تقوم بإعداد جميع روابط معالج الخدمة والتمثيل. هذا أساسا من أجل البساطة.

يستخدم Framework GWT-Platform شوكة GWT-Dispatch للتعامل مع طلبات RPC. هناك الكثير من التعليمات البرمجية ، التي ربما كان عليك أن تضعها في نفسك ، إذا كنت تفكر في استخدام مرسل و Guice بجدية. انا اوصي بشده به.

أولا ، أنا أتعاطف. وضع كل هذا معًا لم يتم توثيقه في أي مكان واحد. سأجيب على كل من أسئلتك بدوره. أضف تعليقات إلى إجابتي إذا كان أي منها غير واضح.

Qu: كيف يجب أن أكتب DispatchServletModule وكيفية جعلها مستمرة (مع ما يجب أن أخدمه)؟

هناك فئة guicestandardDispatchServlet في net.customware.gwt.dispatch.server.guice حزمة ؛ استخدام هذا. لست متأكدًا بنسبة 100 في المائة من السبب ، لكن المسار الذي أستخدمه يشمل اسم وحدة GWT الخاصة بي ، يليه "/Dispatch". قد تضطر إلى تجربة ذلك.

public class MyServletModule extends ServletModule {
  @Override protected void configureServlets() {
    serve("/com.my.module.name/dispatch")
      .with(GuiceStandardDispatchServlet.class);
  }
}

Qu: ما الذي يجب أن أضعه في ملف web.xml لتطبيقي لتتمكن من تنفيذ الإجراءات بشكل صحيح من مقدم العرض الخاص بي ، والذي قام Gin بحقن تطبيق DispatcherAsync؟

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <filter>
    <filter-name>guiceFilter</filter-name>
    <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>guiceFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <listener>
    <listener-class>com.myapp.whatever.MyContextListener</listener-class>
  </listener>
  ...
</web-app>

... وبعد ذلك ستحتاج إلى مستمع سياق مخصص ينشئ حاقن Guice على النحو التالي. لاحظ أنني قمت بتضمين ContactModule ، والذي يربط معالجات الإجراء.

public class MyContextListener extends GuiceServletContextListener {
  @Override protected Injector getInjector() {
    return Guice.createInjector(new MyServletModule(), 
      new ContactModule(), new SQLStuffModule());
  }
}

Qu: أين يجب أن أضع طريقة توفير SQLSessionFactory الخاصة بي (في أي وحدة) لتكون قادرة على حقن SQLSessionFactory حيث أحتاج إليها؟

لاحظ أنني قمت بتضمين SQLStuffModule جديد في مقتطف الكود السابق ؛ سيكون ذلك مكانًا جيدًا لوضع ملزمة SQLSessionFactory الخاصة بك. لا يوجد ضرر وجود وحدات متعددة ، وأجد أنه يحافظ على المخاوف المختلفة المنفصلة بشكل جيد.

Qu: كيف أقوم بتثبيت الحاقن ، لذا يمكنني استخدامه في معالجات الإجراءات الأخرى بشكل صحيح؟

للحصول على جانب الخادم ، راجع مقتطف رمز MyContextListener أعلاه.

على جانب العميل ، ستحتاج إلى واجهة حاقن مخصصة شيء من هذا القبيل:

@GinModules(StandardDispatchModule.class, MyClientModule.class)
public interface MyGinjector extends Ginjector {
  MyWidgetMainPanel getMainPanel();
}

... ويمكنك ربط أشياء MVP الخاصة بك في وحدة الجن المخصصة على النحو التالي. أنا آسف لأنني لست على دراية بـ MVP4G ، لكنني أفترض أنك ستحتاج إلى توصيل المشاهدات والمقدمين معًا في فئة الوحدة النمطية.

public class MyClientModule extends AbstractGinModule {
  @Override protected void configure() {
    bind(...).to(...);
    ...
  }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top