2013-01-23 27 views
7

ile döndürme İki kapsamım var, biri diğerinin içine yerleştirilmiş. Belirli bir hizmeti çözdüğümde, bir bileşenin tek bir kapsamda ve çocuk kapsamındaki farklı bir çözümde çözülmesini istiyorum. Bunu yapmanın kolay bir yolu var mı?Farklı bileşenlerdeki farklı bileşenleri Autofac

Ben geçerli kapsamı nedir belirleyen bir fabrika sınıfını kullanarak çalışan ve daha sonra uygun bir örneğini dönen bir şey almak başardı:

Bu yaklaşım ile sorunların vardır
IContainer BuildContainer() 
{ 
    var builder = new ContainerBuilder(); 

    // ... 
    builder.RegisterType<FooInParentScope>().AsSelf(); 
    builder.RegisterType<FooInChildScope>().AsSelf(); 
    builder.RegisterType<FooFactory>().AsImplementedInterfaces(); 
    builder.Register<IFoo>(c => c.Resolve<IFooFactory>().GetFoo()).InstancePerLifetimeScope(); 
    // ... 
} 


class FooFactory : IFooFactory 
{ 
    private readonly ILifetimeScope m_scope; 

    public FooFactory(ILifetimeScope scope) 
    { 
     m_scope = scope; 
    } 

    public IFoo GetFoo() 
    { 
     if (m_scope.Tag == "ParentScope") 
      return m_scope.Resolve<FooInParentScope>(); 
     else 
      return m_scope.Resolve<FooInChildScope>(); 
    } 
} 

class FooInParentScope : IFoo 
{ 
} 

class FooInChildScope : IFoo 
{ 
} 

:

  1. Ekstra bir sınıf eklemek zorundayım (veya IFooFactory'nin gerçekten gerekli olup olmadığından emin değilseniz 2)
  2. Yukarıdaki kod, ParentScope'ta iç içe geçmiş diğer kapsamlarla baş edemiyor. Bu kapsamı Autofac.Core.Lifetime.LifetimeScope'a getirerek ve ParentLifetimeScope özelliğini inceleyerek düzeltebilirim, ancak bu muhtemelen yapılması güvenli bir şey değildir.

cevap

10

FooInParentScope'u kök kabında SingleInstance olarak kaydedebilirsiniz. Ve iç ömürleri oluştururken FooInChildScope için SingleInstance (geçersiz kılma kaydı) için kayıt ekleyin.

builder.RegisterType<FooInParentScope>().As<IFoo>.SingleInstance(); 
var container = builder.Build(); 

var childScope = container.BeginLifetimeScope(innerBuilder => 
    { 
     // override registration for IFoo in child lifetime scope: 
     innerBuilder.RegisterType<FooInChildScope>().As<IFoo>().SingleInstance(); 
    }); 

FooInParentScope fooInParentScope = (FooInParentScope) container.Resolve<IFoo>(); 
FooInChildScope fooInChildScope = (FooInChildScope) childScope.Resolve<IFoo>(); 
+2

Bu, düşünmediğim bir yöntemdir. Dezavantajı, her şeyi tek bir yerde ele almak yerine, kapsamı oluşturma noktasında ek bir kayıt yaptırmanız gerektiğidir. –

İlgili konular