echofool / Microsoft.Practices.Unity.Tracking

tracking dependency chain when use Microsoft.Practices.Unity for IoC

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Microsoft.Practices.Unity.Tracking

tracking dependency chain when use Microsoft.Practices.Unity for IoC

namespace Microsoft.Practices.Unity.Tracking.Tests
{
    [TestFixture]
    public class TrackingInjectionFactoryTests
    {
        public IUnityContainer Container { get; set; }
        [SetUp]
        public void Initialize()
        {
            Trace.Listeners.Add(new ConsoleTraceListener());
            Container = new UnityContainer();
            Container.Tracking();
            Container.RegisterType<UserService>();
            Container.RegisterType<ILog>(new TrackingInjectionFactory((container, context, policy) => LogManager.GetLogger(policy.RequestType?.Name ?? "null")));
        }

        [Test]
        public void TrackingInjectionFactoryTest()
        {
            Parallel.For(0, 1, new ParallelOptions { MaxDegreeOfParallelism = 10 }, i =>
            {
                var userService = this.Container.CreateChildContainer().Resolve<UserService>();
                Trace.WriteLine(userService.Log.Logger.Name, "UserService.Log.Logger.Name");
                Trace.WriteLine(userService.Repository.Log.Logger.Name, "UserService.Repository.Log.Logger.Name");
            });
            var action = new Action(() =>
            {
                var log = this.Container.CreateChildContainer().Resolve<ILog>();
                Trace.WriteLine(log.Logger.Name, "Logger.Name");
            });
            action();
            var asyncResult = action.BeginInvoke(null, null);
            action.EndInvoke(asyncResult);
        }

        public class UserService
        {
            public UserRepository Repository { get; }
            public ILog Log { get; set; }

            public UserService(UserRepository repository, ILog log)
            {
                Repository = repository;
                Log = log;
            }
        }

        public class UserRepository
        {
            public ILog Log { get; }

            public UserRepository(ILog log)
            {
                Log = log;
            }
        }
    }
}

Output:
UserService.Log.Logger.Name: UserService
UserService.Repository.Log.Logger.Name: UserRepository
Logger.Name: TrackingInjectionFactoryTests
Logger.Name: TrackingInjectionFactoryTests

see discussions
#You can obtain a specified logger for each type.:blush:

About

tracking dependency chain when use Microsoft.Practices.Unity for IoC

License:Apache License 2.0


Languages

Language:C# 100.0%