【问题标题】:Autofac IoC GetInstance methodAutofac IoC GetInstance 方法
【发布时间】:2013-06-10 10:26:36
【问题描述】:

我正在尝试在我的项目中使用 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>(); 
        }

但 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>();
        }

但这次我收到此错误:“无法加载文件或程序集'Autofac,Version=2.6.1.841,Culture=neutral,PublicKeyToken=17863af14b0044da'或其依赖项之一。”

可能是什么问题?

【问题讨论】:

    标签: c# dependency-injection autofac


    【解决方案1】:

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

    var builder = new ContainerBuilder();
    builder.RegisterType<MyService>().As<IMyService>(); 
    var container = builder.Build();
    

    然后你可以使用Resolve扩展方法获取一个注册服务的实例。

    var service = container.Resolve<IMyService>();
    

    【讨论】:

    • 好吧,我试过这个方法,但我得到一个错误:“ILogger 尚未注册。要么注册一个组件来提供服务,使用 IsRegistered() 检查服务注册,或者使用 ResolveOptional()解决可选依赖项的方法。”。但我注册了“ILogger”。缺少什么?
    【解决方案2】:

    确保 Autofac.dll 程序集存在于应用程序的 bin 文件夹中,并且该程序集的版本与 StarlightFramework.Logging 使用的版本相同。

    【讨论】:

      猜你喜欢
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多