Создание нескольких экземпляров Импортированных частей MEF

import java.util.Stack;

class Demo
{

    char c;

    public  boolean checkParan(String word)
    {
        Stack<Character> sta = new Stack<Character>();
        for(int i=0;i<word.length();i++)
        {
           c=word.charAt(i);


          if(c=='(')
          {
              sta.push(c);
              System.out.println("( Pushed into the stack");

          }
          else if(c=='{')
          {
              sta.push(c);
              System.out.println("( Pushed into the stack");
          }
          else if(c==')')
          {
              if(sta.empty())
              {
                  System.out.println("Stack is Empty");
                  return false;
              }
              else if(sta.peek()=='(')
              {

                  sta.pop();
                  System.out.println(" ) is poped from the Stack");
              }
              else if(sta.peek()=='(' && sta.empty())
              {
                  System.out.println("Stack is Empty");
                  return false;
              }
          }
          else if(c=='}')
          {
              if(sta.empty())
              {
               System.out.println("Stack is Empty");
              return false;
              }
              else if(sta.peek()=='{')
              {
                  sta.pop();
                  System.out.println(" } is poped from the Stack");
              }

          }

          else if(c=='(')
          {
              if(sta.empty())
              {
                 System.out.println("Stack is empty only ( parenthesis in Stack ");  
              }
          }


        }
    // System.out.print("The top element is : "+sta.peek());
    return sta.empty();
    } 





}
<ч>
public class ParaenthesisChehck {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
       Demo d1= new Demo();
     //  d1.checkParan(" ");
      // d1.checkParan("{}");
       //d1.checkParan("()");
       //d1.checkParan("{()}");
     // d1.checkParan("{123}");
       d1.checkParan("{{{}}");





    }

}
11
задан TimothyP 3 June 2009 в 23:19
поделиться

5 ответов

Сегодня в MEF нет «встроенной» поддержки для этого, но, прежде чем вернуться к Service Locator, вы можете найти кое-что для вдохновения здесь: http: //blogs.msdn. com / nblumhardt / archive / 2008/12/27 / container-managed-application-design-prelude-where-does-the-container-own.aspx

Основная идея состоит в том, что вы «импортируете» контейнер в компонент

Мы изучаем более прямую поддержку этого сценария.

Ник

ОБНОВЛЕНИЕ: MEF теперь имеет экспериментальную поддержку для этого. См. это сообщение в блоге для получения дополнительной информации.

9
ответ дан 3 December 2019 в 01:39
поделиться

Я не уверен, что это то, о чем говорит Николас, но вы могли бы импортировать класс Factory, а не класс экземпляра, например:

[Import(typeof(ILedPanelFactory)]
public ILedPanelFactory PanelFactory { get; set; }

... а затем позже в вашем коде ...

ILedPanel panel = PanelFactory.BuildPanel();
10
ответ дан 3 December 2019 в 01:39
поделиться

Я думаю, вы имеете в виду, что хотите использовать MEF в этом случае как локатор службы, а не контейнер для внедрения зависимостей. Посмотрите примеры для ValueResolver

2
ответ дан 3 December 2019 в 01:39
поделиться

Ищу в образце игры с фигурами, который поставляется с MEF, есть класс ShapeFactory:

[Export]
public class ShapeFactory
{
    private readonly Random random = new Random((int)DateTime.Now.Ticks);

    [Import]
    private ICompositionService CompositionService { get; set; }

    public IShape GetRandomShape()
    {
        var shapeRetriever = new ShapeRetriever();

        CompositionService.SatisfyImports(shapeRetriever);

        int randomIndex = random.Next(shapeRetriever.PossibleShapes.Length);

        return shapeRetriever.PossibleShapes[randomIndex].GetExportedObject();
    }

    private class ShapeRetriever
    {
        [ImportMany(RequiredCreationPolicy = CreationPolicy.NonShared)]
        public Export<IShape, IShapeMetadata>[] PossibleShapes { get; set; }
    }
}

, который демонстрирует создание экземпляров случайных фигур «по запросу» ... Я бы подумал, что в вашем сценарии вы могли бы сделать что-то подобное без выбора случайного реализация, как вы предполагаете, будет зарегистрирована только одна реализация ILedPanel.

3
ответ дан 3 December 2019 в 01:39
поделиться

Если я не неправильно понимаю вопрос, похоже, что он будет решен простым использованием CreationPolicy.NonShared.

Предполагается, что код, объявляющий Panel, существует везде, где вы хотите создать панель. Вы получите новый экземпляр ILedPanel в каждом экземпляре каждого класса, имеющего это объявление (импорт).

5
ответ дан 3 December 2019 в 01:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: