Autofac IoC GetInstance方法

meh*_*rif 3 c# dependency-injection autofac

我正在尝试在我的项目中使用autofac.所以在Mef中,我可以使用此代码获取接口的实例:

private static CompositionContainer _container;

        public static void Initialize()
        {
            string path = AppDomain.CurrentDomain.BaseDirectory.Contains(@"\bin") ?
                AppDomain.CurrentDomain.BaseDirectory :
                Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin");

            //DirectoryCatalog catalog = new DirectoryCatalog(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin"), "*.Data*.dll");
            DirectoryCatalog catalog = new DirectoryCatalog(path, "*.dll");
            _container = new CompositionContainer(catalog);
            _container.ComposeParts();
        }

        private static void CheckContainer()
        {
            if (_container == null)
            {
                Initialize();
            }
        }

        public static T GetInstance<T>()
        {
            CheckContainer();

            return _container.GetExportedValue<T>(); 
        }
Run Code Online (Sandbox Code Playgroud)

但autofac似乎让我感到困惑......我如何使用autofac将此功能添加到我的应用程序?

谢谢


我将该代码更改为:

private static ContainerBuilder _container;
        private static IContainer container;

        public static void Initialize()
        {
            _container = new ContainerBuilder();
            var logging = Assembly.Load("StarlightFramework.Logging");
            _container.RegisterAssemblyTypes(logging);
            container = _container.Build();

        }

        public static T GetInstance<T>()
        {
            if(container == null)
                Initialize();
            return container.Resolve<T>();
        }
Run Code Online (Sandbox Code Playgroud)

但是这次我得到了这个错误:"无法加载文件或程序集'Autofac,Version = 2.6.1.841,Culture = neutral,PublicKeyToken = 17863af14b0044da'或其中一个依赖项."

可能是什么问题?

Mar*_*icz 9

首先,您必须构建容器并注册您的服务.

var builder = new ContainerBuilder();
builder.RegisterType<MyService>().As<IMyService>(); 
var container = builder.Build();
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用Resolve扩展方法获取已注册服务的实例.

var service = container.Resolve<IMyService>();
Run Code Online (Sandbox Code Playgroud)