你这个直接用就行,把你需求的东西写好方法封装起来就行,和你平常写方法一样,就看你对这个控件怎么用了,比如你写一个扩展方法,不是直接调研,
public list<T> aa(){ //初始化一个对象 a var a=new List<T>() //你上面的那种形式 a.funvtion(); return list<T>; }
ContainerBuilder只会创建一次,没明白你的写法。
@jakeys: 我的理解错了,你是想要直接注入到项目中,所以在起始的时候注入到项目中,你需要用的时候就可以直接用,封装的时候可以和我上面的封装一样,一个类里面写好所有的封装,再用IOC依赖注入
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>(); }
按照这种形式包装一下就好!
在程序初始化的时候调用InitIocContainer,你这种写法在调用 GetInstance时每次都会创建一次ContainerBuilder吧
@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就好了。
@幻天芒: 不太明白你这种形式怎么用在正式项目中.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 里都能使用。暂时还没明白原理
@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>();
AutofacDependencyResolver.Current.RequestLifetimeScope 是可以用的。前提是必须是在WEB线程中使用。建议直接使用构造器注入。少用DIConfig.Current.GetServices<T>()