2013-06-18 26 views
4

我的代碼如下Unity.AutoRegistration ??根據公約登記統一

IUnityContainer container = new UnityContainer(); 

container 
.ConfigureAutoRegistration() 
.LoadAssemblyFrom(typeof(Test).Assembly.Location) 
.LoadAssemblyFrom(typeof(ITest).Assembly.Location) 
.ApplyAutoRegistration(); 

這是我的第一個問題。

我不知道我是否使用了LoadAssemblyFrom方法正確位置:

ITest test = container.Resolve<ITest>(); 

當我嘗試編譯我得到的異常「ResolutionFailedException」。

我在做什麼錯?

感謝您的時間提前。

回答

4

看來,你正在尋找的是這樣的:

container.ConfigureAutoRegistration() 
     .LoadAssemblyFrom(typeof(ITest).Assembly.Location) 
     .LoadAssemblyFrom(typeof(Test).Assembly.Location) 
     .Include(If.ImplementsITypeName, Then.Register()) 
     .ApplyAutoRegistration(); 

這將告訴Unity.AutoRegistration註冊各類那裏是具有相同名稱的接口,與一

1

前綴下面是一個完整的工作控制檯示例,演示如何根據約定將Unity設置爲註冊,然後將控制轉移到依賴注入領域。您將不得不添加Unity NuGet包才能使用。

使用Unity V3.5和VS 2012

#region 
using System; 
using Microsoft.Practices.Unity; 

#endregion 

namespace Demo___Unity 
{ 
    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      using (var container = new UnityContainer()) 
      { 
       // Manual method. 
       //container.RegisterType<IEntryPoint, EntryPoint>(); 
       //container.RegisterType<IInjected, Injected>(); 

       // Set up registration by convention. 
       // http://blogs.msdn.com/b/agile/archive/2013/03/12/unity-configuration-registration-by-convention.aspx 
       container.RegisterTypes(
        AllClasses.FromAssembliesInBasePath(), 
        WithMappings.FromMatchingInterface, 
        WithName.Default, 
        WithLifetime.ContainerControlled); 

       var controller = container.Resolve<IEntryPoint>(); 
       controller.Main(); 
      } 
     } 
    } 

    public interface IEntryPoint 
    { 
     string Name { get; set; } 
     void Main(); 
    } 

    public class EntryPoint : IEntryPoint 
    { 
     private readonly IInjected Injected; 

     public EntryPoint(IInjected injected) 
     { 
      Injected = injected; 
     } 

     public void Main() 
     { 
      Console.Write("Hello, world!\n"); 
      Injected.SubMain(); 
      Injected2.SubMain(); 
      Console.Write("[any key to continue]"); 
      Console.ReadKey(); 
     } 

     // Demonstrates property injection. 
     [Dependency] 
     public IInjected Injected2 { get; set; } 

     public string Name { get; set; } 
    } 

    public interface IInjected 
    { 
     void SubMain(); 
    } 

    public class Injected : IInjected 
    { 
     public void SubMain() 
     { 
      Console.Write("Hello, sub world!\n"); 
     } 

     public string Name { get; set; } 
    } 
} 
測試