4

我的代码如下

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

2 回答 2

4

看来您正在寻找的是:

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

这将告诉 Unity.AutoRegistration 注册具有相同名称的接口的所有类型,前缀为 I。

于 2013-06-18T12:50:21.310 回答
1

这是一个完整的工作控制台示例,展示了如何按照约定设置 Unity 以进行注册,然后将控制权转移到依赖注入世界。您必须添加UnityNuGet 包才能使其正常工作。

使用 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; }
    }
}
于 2014-09-03T22:59:49.460 回答