저는 Autofac을 처음 사용하고 다음과 같은 StructureMap 구성 요소 등록을 번역하고 싶지만 구현이 권장 된 방식으로 수행되지 않을 수도 있습니다. Autofac은 평생 범위 (예 : container.Resolve)를 벗어나지 않아야한다는 사실에 큰 역점을 두지 만 물론 container.BeginLifetimeScope()
은 ContainerBuilder
을 만들 때까지 사용할 수 없습니다.구조체를 Autofac 버전으로 변환
For<ISessionSource>().Singleton().Use<NHibernateSessionSource>();
For<ISession>().Use(ctx => {
var unitOfWork = (INHibernateUnitOfWork)ctx.GetInstance<IUnitOfWork>();
return unitOfWork.Session;
});
For<IUnitOfWork>().HybridHttpOrThreadLocalScoped().Use<NHibernateUnitOfWork>();
Autofac는 :
builder.RegisterType<NHibernateSessionSource>().As<ISessionSource>().SingleInstance();
// Is the following recommended? Define that whenever request an `ISession` it should return the `Session` property of the concrete implementation of `INHibernateUnitOfWork`:
builder.Register(ctx =>
{
var unitOfWork = (INHibernateUnitOfWork)ctx.Resolve<IUnitOfWork>();
return unitOfWork.Session;
}).As<ISession>().InstancePerRequest();
builder.RegisterType<NHibernateUnitOfWork>().As<IUnitOfWork>().InstancePerRequest();
귀하의 우려를 표명하고 있습니다. 구현은 나에게 잘 보이고, ** 매우 ** StructureMap에 가깝다. 조금 더 자세히 설명해 주시겠습니까? –
네, 구조 맵과 매우 흡사합니다. (자주 질문을 썼듯이 첫 번째 구현에서이를 향상 시켰지만 자주 발생합니다 ;-). Autofac은 루트 컨테이너에서 서비스를 직접 확인하지 않고 내포 된 LifetimeScope에서 직접 서비스를 해결할 것을 권고합니다. 그러나 컨테이너를 작성하기 전에 그렇게 할 수 없습니다. 나는 이것이 올바른 구현이라는 것을 확신하지만 Autofac을 완전히 처음 접했기 때문에 아무것도 놓치지 않기를 바랬다. (컨테이너를 만들기 전에 container.BeginLifetimeScope와 같은 것을하는 방법). – Ted
"루트 컨테이너에서 바로 구성 요소를 확인할 수는 있지만 응용 프로그램을 통해이를 수행하면 메모리 누수가 발생할 수 있습니다. 서비스 인스턴스가 제대로 작동하는지 확인하려면 가능하면 수명 범위에서 구성 요소를 항상 해결하는 것이 좋습니다 폐기 및 쓰레기 수거. " – Ted