songjun
2024-09-04 cc908053e0b5075fbfd27350b6da4b39bca9e550
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using Autofac;
using Autofac.Integration.Mvc;
using Autofac.Integration.WebApi;
 
namespace PalGain.Core
{
    public class PalGainEngine
    {
        private static PalGainEngine g_instance = null;
        private ContainerManager _containerManager;
        public static PalGainEngine Instance
        {
            get
            {
                if (g_instance == null)
                {
                    g_instance = new PalGainEngine();
                }
                return g_instance;
            }
        }
        public IContainer Container
        {
            get;
            private set;
        }
        public void Register()
        {
            var Builder = new ContainerBuilder();
            Container = Builder.Build();
 
            var typeFinder = new WebAppTypeFinder();
            Builder = new ContainerBuilder();
            //发现类型IDependencyRegistrar的实现类
            var drTypes = typeFinder.FindClassesOfType<IDependencyRegistrar>();
            var drInstances = new List<IDependencyRegistrar>();
            foreach (var drType in drTypes)
            {
                drInstances.Add((IDependencyRegistrar)Activator.CreateInstance(drType));
            }
            //查询能力
            drInstances = drInstances.AsQueryable().OrderBy(t => t.Order).ToList();
            foreach (var dependencyRegister in drInstances)
            {
                //依赖登记
                dependencyRegister.Register(Builder, typeFinder);
            }
            Builder.Update(Container);
            _containerManager = new ContainerManager(Container);
            DependencyResolver.SetResolver(new AutofacDependencyResolver(Container));
        }
        public void RegisterWebApi()
        {
            var Builder = new ContainerBuilder();
            Container = Builder.Build();
 
            var typeFinder = new WebAppTypeFinder();
            Builder = new ContainerBuilder();
            var drTypes = typeFinder.FindClassesOfType<IDependencyRegistrar>();
            var drInstances = new List<IDependencyRegistrar>();
            foreach (var drType in drTypes)
            {
                drInstances.Add((IDependencyRegistrar)Activator.CreateInstance(drType));
            }
            drInstances = drInstances.AsQueryable().OrderBy(t => t.Order).ToList();
            foreach (var dependencyRegister in drInstances)
            {
                dependencyRegister.Register(Builder, typeFinder);
            }
            Builder.Update(Container);
            _containerManager = new ContainerManager(Container);
        }
        public ContainerManager ContainerManager
        {
            get { return _containerManager; }
        }
        public T Resolve<T>() where T : class
        {
            return ContainerManager.Resolve<T>();
        }
        public object Resolve(Type type)
        {
            return ContainerManager.Resolve(type);
        }
        public T ResolveNamed<T>(string key = "") where T : class
        {
            return ContainerManager.Resolve<T>(key);
        }
    }
}