首页 新闻 会员 周边

关于Autofac的一些问题.

0
悬赏园豆:30 [待解决问题]

对于Autofac这个组件不是很熟,网上教程也都只说了一些基本用法,大部分都是构造函数输入.

现想对这个组件做进一步的封装,以满足更多需求。例如这种用法DIConfig.Current.GetServices<T>()就可以获取到依赖的对象.这个要怎么封装。

sky_net的主页 sky_net | 初学一级 | 园豆:10
提问于:2015-09-02 22:23
< >
分享
所有回答(3)
0

你这个直接用就行,把你需求的东西写好方法封装起来就行,和你平常写方法一样,就看你对这个控件怎么用了,比如你写一个扩展方法,不是直接调研,

public list<T> aa(){
     //初始化一个对象 a
     var a=new List<T>()
     //你上面的那种形式
     a.funvtion();
     return list<T>;
}
稳稳的河 | 园豆:4216 (老鸟四级) | 2015-09-03 00:56

ContainerBuilder只会创建一次,没明白你的写法。

支持(0) 反对(0) sky_net | 园豆:10 (初学一级) | 2015-09-04 20:30

@jakeys: 我的理解错了,你是想要直接注入到项目中,所以在起始的时候注入到项目中,你需要用的时候就可以直接用,封装的时候可以和我上面的封装一样,一个类里面写好所有的封装,再用IOC依赖注入

支持(0) 反对(0) 稳稳的河 | 园豆:4216 (老鸟四级) | 2015-09-05 14:45
0
private IContainer container;

        public AutofacProvider()
        {
            this.InitIocContainer();
        }
        private void InitIocContainer()
        {
            var builder = new ContainerBuilder();
            builder.RegisterType<Test1>().As<Test1>();
            container=builder.Build();
        }

        public T GetInstance<T>()
        {
            return container.Resolve<T>();
        }

按照这种形式包装一下就好!

幻天芒 | 园豆:37175 (高人七级) | 2015-09-03 23:28

在程序初始化的时候调用InitIocContainer,你这种写法在调用 GetInstance时每次都会创建一次ContainerBuilder吧

支持(0) 反对(0) sky_net | 园豆:10 (初学一级) | 2015-09-04 20:33

@jakeys: 不会哈,GetInstance并不会去实例化这个对象,代码没贴全。

 public static class IocHelper
    {
        private static IContainerProvider staticIContainerProvider;

        public static void SetIocProvider(IContainerProvider containerProvider)
        {
            staticIContainerProvider = containerProvider;
        }

        private static void CheckContainerProviderNotNull()
        {
            if (staticIContainerProvider == null)
            {
                // ReSharper disable once NotResolvedInText
                throw new ArgumentNullException("使用IocContainer之前,请先调用IocHelper.SetIocProvider初始化!");
            }
        }

        /// <summary>
        /// 获取实例对象
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <returns></returns>
        public static T GetInstance<T>()
        {
            CheckContainerProviderNotNull();
            return staticIContainerProvider.GetInstance<T>();
        }
    }
 public class AutofacProvider:IContainerProvider
    {
        private IContainer container;

        public AutofacProvider()
        {
            this.InitIocContainer();
        }
        private void InitIocContainer()
        {
            var builder = new ContainerBuilder();
            builder.RegisterType<Test1>().As<Test1>();
            container=builder.Build();
        }

        public T GetInstance<T>()
        {
            return container.Resolve<T>();
        }
    }
  //IOC
            IocHelper.SetIocProvider(new AutofacProvider());
            var test1=IocHelper.GetInstance<Test1>();
            Console.WriteLine(test1.GetTest());

这样的做法,是为了能够动态切换IOC框架。你只需要关注如何包装Autofac就好了。

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2015-09-04 20:40

@幻天芒: 不太明白你这种形式怎么用在正式项目中.container.Resolve<T>()在使用前,每次都必须执行InitIocContainer()。

container接口不应该每次都创建,研究了一下.

Mvc里获取container可以这么用:

ILifetimeScope scope = AutofacDependencyResolver.Current.RequestLifetimeScope;

var productService= scope.Resolve<IProductService>()

最后发现。

var resolver = GlobalConfiguration.Configuration.DependencyResolver;

return resolver.BeginScope().GetService(typeof(IProductService)) as IProductService;

这样在mvc 和 api 里都能使用。暂时还没明白原理

支持(1) 反对(0) sky_net | 园豆:10 (初学一级) | 2015-09-04 23:25

@jakeys: 

public static class AutofacHelper
{
    private static IContainer container;

    //程序启动时执行一次。
    public static void InitIocContainer()
    {
        var builder = new ContainerBuilder();
        //注册所有服务
        builder.RegisterType<Test1>().As<Test1>();
        container=builder.Build();
    }

    //获取具体的实例
    public static T GetInstance<T>()
    {
        return container.Resolve<T>();
    }
}

如何使用?

var test1 = AutofacHelper.GetInstance<Test1>();
支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2015-09-05 10:01
0

AutofacDependencyResolver.Current.RequestLifetimeScope 是可以用的。前提是必须是在WEB线程中使用。建议直接使用构造器注入。少用DIConfig.Current.GetServices<T>() 

不夜橙 | 园豆:253 (菜鸟二级) | 2015-09-09 11:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册