문제
나는 윈폼 응용 프로그램 MEF와 플러그인을 구현하고있어 내가 이해가 안 조성물과 몇 가지 동작을 알았어 야와 무슨 일이 일어나고 있는지 이해하는 데 도움이됩니다.MEF는 - 컨테이너와 구성
그냥 길에서 그걸 얻기 위해, 내가 .NET ATL 촌놈의 일종으로 4
와 MEF를 사용하고, 닥터, 여기에 내가 용기와 구성에 관해서에 명확하지 않다 무엇인가 :
- 내가, 자체 내 보낸 일부 클래스의 내부에 컨테이너를 구성하고
ComposeParts(this)
를 호출하면 해당 클래스의 기존 인스턴스가 컨테이너에 추가 또는 다른 인스턴스가 생성된다? GetExportedValue<T>()
메서드를 사용할 때 반환 된 파트가 이미 작성되었거나 가져 오기가 채워져 있어야합니까? 아니면 명시 적으로 파트를 작성해야합니까? 첫 번째 질문에 대해서는 는
... 각 질문에 대한 자세한 내용은 읽어
배경
, I는 "정상"애플리케이션 된 UserControls를 호스팅 할 패널이있는 기본 응용 프로그램 양식을 플러그인으로부터의 usercontrols. 이 주요 응용 프로그램 양식은 IHostingForm
이라는 인터페이스를 구현하여 일부 기능을 플러그인에 제공합니다. 이 주요 신청서 양식은 IHostingForm
인터페이스를 통해 자신을 수출하며 수입이 필요합니다. 여기에 코드입니다 : 그 자체를 수출하는 방법을 위의 코드 조각에서
[Export(typeof(IHostingForm))]
public partial class frmMain : RibbonForm, IHostingForm
{
//public/private form methods here...
private CompositionContainer _container;
//An import that needs to be filled.
[ImportMany]
public IEnumerable<Lazy<IAddInController, IAddInControllerMetadata>> AddInControllers;
public frmMain()
{
//Init code here omitted to save space...
//Setup the container
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(typeof(Program).Assembly));
//Temporary location while testing...
catalog.Catalogs.Add(new DirectoryCatalog(Application.StartupPath));
_container = new CompositionContainer(catalog);
try
{
//Is the current instance of the class (this) added to the
//container or does the container construct its own instance?
_container.ComposeParts(this);
}
catch (CompositionException ex)
{
//Error catching code omitted...
}
}
//IHostingForm implementation
public void AddTabToTabBar(string tabText)
{
RibbonTab rt = new RibbonTab(tabText);
//Some more init code here which I'm leaving out to save space...
this.ribbonBar1.CommandTabs.Add(rt);
}
//etc...
}
공지 사항뿐 아니라 생성자에서 ComposeParts(this)
호출? 이렇게하면 양식의 인스턴스가 별도로 생성되거나 ComposeParts(this)
이 이미 존재하는 인스턴스를 사용하고 컨테이너에 추가하기에 충분한 지 알 수 있습니까?
이것은 두 번째 질문입니다. 위에서 사용하고있는 구성 방법이 맞는지 아닌지 잘 모르겠습니다. 응용 프로그램의 프로그램 클래스에서 컨테이너를 만들려고했는데 이해가되지 않는 다른 동작을 발견했습니다. 나는이 같은 형태의 클래스 중 및 프로그램에 컨테이너 초기화 코드 이동 :
static class Program
{
internal static CompositionContainer _container;
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//Setup the container
var catalog = New AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(typeof(Program).Assembly));
catalog.Catalogs.Add(new DirectoryCatalog(Application.StartupPath));
_container = new CompositionContainer(catalog);
IHostingForm frm = _container.GetExportedValue<IHostingForm>();
//If I don't call this, the form's imports don't get satisfied
_container.CompostParts(frm);
Application.Run((Form)frm);
}
}
MSDN에있는 문서를 바탕으로
도 the answer to this question을, 나는 GetExportedValue<T>()
방법은 주어진의 수출을 인스턴스화 할 것이라는 인상이었다 유형을 작성하고 컨테이너를 작성했기 때문에 (또는 종속성을 만족 시키십시오) 컨테이너에서 나오기 때문입니다. 그러나 테스트를 통해, 컨테이너에서 부품을 가져온 후에 가져온 부품을 채우기 위해 컨테이너를 명시 적으로 말해야한다고 생각합니다. 이것은 내가 지금까지 읽은 것과 모순되는 것 같습니다.
여러 질문인지 확실하지 않았습니다. 그들이 헤어질 필요가 있으면 알려주세요.이 질문을 편집하고 다른 질문을 만들어 드리겠습니다. 그러나 나에게있어서 그들은 용기와 구성에 어떤 일이 벌어지고 있는지에 대한 나의 이해가 부족하다는 점에서 관련이있는 것으로 보인다.