MEF를 ASP.NET에 성능 손실 없이 적용하려면?
어제의 이야기에 이어서.
MEF가 적용된 ASP.NET 웹 사이트를 제니퍼 닷넷으로 모니터링 해본 결과!
; https://www.sysnet.pe.kr/2/0/1203
그래도 왠지 찜찜합니다. 다시... 코드를 살펴보겠습니다.
public void Initialize(object o)
{
var batch = new CompositionBatch();
batch.AddPart(o);
try {
DirectoryCatalog directoryCatalog = new DirectoryCatalog(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin"));
var _container = new CompositionContainer(directoryCatalog);
_container.Compose(batch);
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.ToString());
}
}
뭔가... static으로 지정해 놓고 재사용하면 되지 않을까요? 우선, CompositionBatch는 ... 대상이 아닙니다. 왜냐하면 object 인자로 들어오는 인스턴스 자체가 ASP.NET Request 마다 생성되는 웹 페이지 인스턴스이기 때문에 CompositionBatch를 static으로 두는 것은 의미가 없습니다. CompositionContainer는 어떨까요? 아쉽게도 Container는 Compose 메서드 호출을 담당할 뿐 사실 거의 하는 일이 없기 때문에 재사용할 만한 여지가 없습니다.
그렇다면... 남은 것은 DirectoryCatalog 인스턴스가 되겠군요. 잠시 생각해 보면 적절한 후보로 여겨집니다. 왜냐하면 ASP.NET 요청이 들어올 때 마다 매번 /bin 폴더를 검색해서 ComposableParts를 구성할 의미가 없기 때문입니다.
C# Singleton 인스턴스 생성
; https://www.sysnet.pe.kr/2/0/896
위의 글에 따라, Singleton 인스턴스로 다음과 같이 cache를 하는 식으로 코드를 수정해 보았습니다.
public class MEFHelper
{
static object syncObject = new object();
static DirectoryCatalog _directoryCatalog;
DirectoryCatalog DirectoryCatalog
{
get
{
if (_directoryCatalog == null)
{
lock (syncObject)
{
if (_directoryCatalog == null)
{
_directoryCatalog = new DirectoryCatalog(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin"));
}
}
}
return _directoryCatalog;
}
}
public void Initialize(object o)
{
var batch = new CompositionBatch();
batch.AddPart(o);
try {
var _container = new CompositionContainer(DirectoryCatalog);
_container.Compose(batch);
} catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.ToString());
}
}
}
다시 default.aspx를 방문해 보면... 최초로 뜨는 경우에는 약간 느리지만 이후에 재방문 했을 때는 체감속도가 눈에 띄게 빨라졌습니다. 확인을 위해
제니퍼 닷넷의 프로파일링 화면을 보면,
응답시간은 말할 필요도 없고 CPU 사용량도 여느 ASP.NET 웹 페이지 처리하는 수준으로 내려갔습니다.
음... ^^; 하루만에 결론이 바뀌는군요.
"MEF는 ASP.NET에 적용해도 전혀 손색이 없습니다."
단지, 최초 한 번의 요청에서는 시간이 좀 걸릴 뿐!
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]