2010-07-27 46 views
1

我有以下設置Autofac不通過相同的實例來解決的論點構造

public class CommonClass : ICommonClass 
{ 
} 

public class SomeClass : ISomeClass 
{ 
    public SomeClass(ICommonClass common, IOtherClass otherClass) {} 
} 

public class OtherClass : IOtherClass 
{ 
    public OtherClass(ICommonClass common) {} 
} 

//Registration 
builder.RegisterType<CommonClass>().As<ICommonClass>().InstancePerDependency(); 
builder.RegisterType<SomeClass>().As<ISomeClass>().InstancePerDependency(); 
builder.RegisterType<OtherClass>().As<IOtherClass>().InstancePerDependency(); 

我想在每一個構造函數中的普遍的說法是相同的實例,但它創造ICommon時的新實例SomeClass已解決。我怎麼能得到這個時間發生。我試圖將它們註冊爲InstancePerLifetimeScope,但它的行爲與SingleInstance相同。

+0

這裏有一個類似的問題,有一些額外的可能搜索解決方案NS:http://stackoverflow.com/questions/5421803/how-to-inject-two-instances-of-same-object-using-autofac – 2011-03-29 23:31:29

回答

0

InstancePerDependency是當你需要新的實例爲每個依賴的路要走。現在對於不同的依賴類來說,有不同的生命週期是棘手的,並且感覺不對。如果你能詳細說明爲什麼你需要這種行爲,或許可以找到更好的方法。

這就是說,來完成你問什麼(雖然我不喜歡它),你可以利用「實例持有人」。我的想法是,對於常規的依賴關係,新的常見實例將照常服務。但對於特殊情況SomeClass,常見的實例是從這個支架類,始終服務於同一個實例牽強:

public class CommonHolder 
{ 
    public ICommonClass Instance {get;private set;} 
    public CommonHolder(ICommonClass commonInstance) 
    { 
     Instance = commonInstance; 
    } 
} 

,然後註冊設置:

builder.RegisterType<CommonHolder>().SingleInstance(); 
builder.RegisterType<OtherClass>().As<IOtherClass>().InstancePerDependency(); 
builder.RegisterType<CommonClass>().As<ICommonClass>().InstancePerDependency(); 

builder.RegisterType<SomeClass>().InstancePerDependency(); 
builder.Register(c => 
    c.Resolve<SomeClass>(TypedParameter.From(c.Resolve<CommonHolder>().Instance))) 
    .As<ISomeClass>().InstancePerDependency(); 
+0

我們有一個Web應用程序中常見的是HttpRequestScoped。我正在研究利用現有代碼的Windows服務/控制檯管理員應用程序,因此當我運行特定任務並清除時,我需要「常用」設置。 – Thad 2010-07-28 12:37:03

+0

如果是這樣,我很可能具有三個不同的配準模塊,一個用於處理共用的兩個應用程序的註冊,並針對不同的每個應用程序的處理的註冊一個模塊進行操作。 – 2010-07-28 19:33:35

+0

SomeClass的(InstancePerDependency)和OtherClass(InstancePerDependency)被登記在主組件中。 Common是在每個應用程序中註冊的。當其InstancePerDependency我得到一個新的每一次,當我InstancePerLifetime總是得到同樣的一個每次。所以我必須錯過與生命有關的事情。 – Thad 2010-07-28 20:07:23

0

你可以創建一個單獨的命名註冊的ICommonClass和使用解決,只有當SomeClass

// Existing registration 
builder.RegisterType<CommonClass>().As<ICommonClass>().InstancePerDependency(); 

// One-off registration 
builder 
    .RegisterType<CommonClass>() 
    .As<ICommonClass>() 
    .InstancePerLifetimeScope() 
    .Named<ICommonClass>("OneOffCommonClass"); 

// New registrations of dependents 
builder.RegisterType<OtherClass>().As<IOtherClass>().InstancePerDependency(); 

builder 
    .Register(c => new SomeClass(
     c.Resolve<ICommonClass>("OneOffCommonClass"), 
     c.Resolve<IOtherClass>())) 
    .As<ISomeClass>() 
    .InstancePerDependency(); 
相關問題