2013-04-16 3 views
0

송장 응용 프로그램을 개발 중입니다.클래스에 인쇄 기능을 동적으로 추가하십시오.

모듈 방식으로 접근하려면 MEF을 사용하고 있습니다.

나는 프린터에 문서를 인쇄하는 인쇄용 모듈 (PlugIn)을 만들었습니다. 사용자가 판매를 추가 (저장)하면

이제 내 질문에

는 클래스라는 영업이된다. 인쇄 모듈이 설치되어 있는지 확인해야합니다. 그러면 해당 모듈을 사용하여이 판매를 프린터에 전달해야합니다.

나는 이걸 어떻게 얻을 수 있습니까?

내가 가진 아이디어는 내 Sales 클래스의 속성으로 [Import(typeof(IPrint))]을 사용할 것이고이 속성에 대한 값이 있으면 프린터로 문서를 보냅니다.

이 요구 사항에 대한 더 나은 접근 방법이 있습니까?

+0

MEF를 사용하는 경우로드 된 것인지 알 수 있습니다. 단순히 bool IsPluginLoaded를 사용하십시오. – Dilshod

+0

내 질문은 내 응용 프로그램에 인쇄하기위한 인터페이스가 없다고 가정 해 보겠습니다. 나중에 다른 클라이언트 프로그래머가 내 고객을 고용하여 Sales 클래스의 인쇄 기능을 추가하려고합니다. 어떻게하면 판매를 저장 한 후에 그것을 주입 할 것인가? –

+0

확인. 그런 다음 Sales.Save가 해고 될 때 해고 될 메소드 (fire_plugins)를 만들어야합니다. fire_plugins 메소드에서 Sales가 저장 될 때 플러그인을 해고해야합니다. 플러그인을 목록 에 저장하십시오. – Dilshod

답변

1

클래스를 구현하는 방법을 잘 모르겠습니다. 다음과 같이 시도하십시오.

//in your Metadata you should have bool FireOnSave 
public class Sales 
{ 
    IEnumerable<Lazy<T, TMetadata>> myPlugins; 
    private static CompositionContainer _container; 
    static Sales() 
    { 
     var catalog = new AggregateCatalog(); 
     var d = new DirectoryInfo(".\\"); 
     catalog.Catalogs.Add(new DirectoryCatalog(d.FullName)); 
     _container = new CompositionContainer(catalog); 
    } 

    void ImportPlugins() 
    { 
     myPlugins = _container.GetExports<T, TMetadata>(); 
    } 

    public void Save() 
    { 
     //do your saving work here 
     fire_plugins(); 
    } 

    private void fire_plugins() 
    { 
     foreach (var m in myPlugins) 
     { 
      if (m.Metadata.FireOnSave) 
       m.Value.Invoke(); 
     } 
    } 
} 

질문이 있으면 알려주세요.

관련 문제