2012-10-04 67 views
2

考慮接口:是否可以在統一中重複刪除註冊?

public interface IOne{} 
public interface ITwo{} 
public interface IBoth : IOne, ITwo{} 

和類

public class Both : IBoth{} 

但是,當我需要解決的基本接口,我需要兩個接口,容器註冊

<register type="IOne" MapTo="Both"/> 
<register type="ITwo" MapTo="Both"/> 

的問題是 - 我可以通過以下方式對註冊進行重複數據刪除:

<register type="IBoth" MapTo="Both"/> 

但在從不同的接口不同的地方解決它?

var o = containet.Resolve<IOne>(); 
var t = containet.Resolve<ITwo>(); 

我可以做任何其他方式這樣的伎倆,因爲這種情況下是不工作...

回答

3

簡短的回答:您可以「T。 長答案:您可以編寫一個自定義容器擴展,爲您提供這種技巧。

[TestMethod] 
public void TestMethod1() 
{ 
    var container = new UnityContainer().AddNewExtension<DeduplicateRegistrations>(); 
    container.RegisterType<IBoth, Both>(); 
    IThree three = container.Resolve<IThree>(); 
    Assert.AreEqual("3", three.Three()); 
} 

public class DeduplicateRegistrations : UnityContainerExtension 
{ 
    protected override void Initialize() 
    { 
    this.Context.Registering += OnRegistering; 
    } 
    private void OnRegistering(object sender, RegisterEventArgs e) 
    { 
    if (e.TypeFrom.IsInterface) 
    { 
     Type[] interfaces = e.TypeFrom.GetInterfaces(); 
     foreach (var @interface in interfaces) 
     { 
     this.Context.RegisterNamedType(@interface, null); 
     if (e.TypeFrom.IsGenericTypeDefinition && e.TypeTo.IsGenericTypeDefinition) 
     { 
      this.Context.Policies.Set<IBuildKeyMappingPolicy>(
      new GenericTypeBuildKeyMappingPolicy(new NamedTypeBuildKey(e.TypeTo)), 
      new NamedTypeBuildKey(@interface, null)); 
     } 
     else 
     { 
      this.Context.Policies.Set<IBuildKeyMappingPolicy>(
      new BuildKeyMappingPolicy(new NamedTypeBuildKey(e.TypeTo)), 
      new NamedTypeBuildKey(@interface, null)); 
     } 
     } 
    } 
    } 
} 
public class Both : IBoth 
{ 
    public string One() { return "1"; } 
    public string Two() { return "2"; } 
    public string Three() { return "3"; } 
} 
public interface IOne : IThree 
{ 
    string One(); 
} 
public interface IThree 
{ 
    string Three(); 
} 
public interface ITwo 
{ 
    string Two(); 
} 
public interface IBoth : IOne, ITwo 
{ 
} 

您需要微調的擴展,爲了趕接口註冊像IDisposable或覆蓋一個給定接口已經存在的註冊。

+0

謝謝!奇蹟般有效! –

相關問題