Unity.AutoRegistration ?? Convention Based Registration Unity

天涯浪子 提交于 2019-11-27 08:01:20

问题


My code is as follows

IUnityContainer container = new UnityContainer(); 

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

This is my first question.

I'm not sure whether I have used the LoadAssemblyFrom method correctly here:

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

When I try to compile I get the exception "ResolutionFailedException".

What am I doing wrong?

Thanks for your time in advance.


回答1:


It appears that what you are looking for is this:

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

This will tell Unity.AutoRegistration to register all types where there is an interface with the same name, prefixed with I.




回答2:


Here is a complete working console example showing how to set Unity up for registration by convention, then transfer control into the dependency injection world. You will have to add the Unity NuGet package for this to work.

Tested with Unity v3.5 and 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; }
    }
}


来源:https://stackoverflow.com/questions/17168458/unity-autoregistration-convention-based-registration-unity

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!