各位请看代码:
var builder = new ContainerBuilder(); builder.RegisterType<UserRepository>().As<IUserRepository>(); builder.RegisterType<UserMessageRepository>().As<IUserMessageRepository>(); builder.RegisterType<DefaultUserService>().As<IUserService>(); //此处的生命周期如何设定?InstancePerLifetimeScope? //我希望每次从Autofac当中Resolve出IUserService的时候, //相应userRepository,messageRepository共享IRepositoryContext实例,但非全局单例! builder.RegisterType<EntityframeworkRepositoryContext>().As<IRepositoryContext>();//.InstancePerLifetimeScope()? var container = builder.Build(); //当设定为:IRepositoryContext为InstancePerLifetimeScope IUserService userService0 = container.Resolve<IUserService>(); userService0.SetUserMessage(1,1); //成功的 //当设定为:IRepositoryContext为InstancePerLifetimeScope //但是如果这样调用:(假设方法是这样[SetUserMessage(User user,UserMessage message)]) IUserService userService0 = container.Resolve<IUserService>(); User user = userService0.GetUser(1); IUserService userService1 = container.Resolve<IUserService>(); UserMessage message = userService1.GetMessage(1); userService1.SetUserMessage(user,message); //也是成功的。 /* 所以这里让我不解的地方就是: InstancePerLifetimeScope 当中这个Per Lifetime Scope是什么样一个场景呢? 怎么看起来userService0 和userService1还是共享一个IRepositoryContext呢? 这样的话不就有点像Singleton了吗?我想要的是userService0的时候当中的 userRepository0和messageRepository0共享一个IRepositoryContext0,用完即丢掉。 userService1的时候userRepository1和messageRepository1共享另外一个IRepositoryContext。 不知道是不是我理解有误,请熟悉Autofac的园友给解释解释? */ public class UserRepository : IUserRepository { public UserRepository(IRepositoryContext context) { //此处代码忽略 } } public class UserMessageRepository : IUserMessageRepository { public UserMessageRepository(IRepositoryContext context) { //此处代码忽略 } } public class DefaultUserService : IUserService { private readonly IRepositoryContext context; private readonly IUserRepository userRepository; private readonly IUserMessageRepository messageRepository; public DefaultUserService(IRepositoryContext context,IUserRepository userRepository,IUserMessageRepository messageRepository) { this.context = context; this.userRepository = userRepository; this.messageRepository = messageRepository; } //示例方法 public void SetUserMessage(int userId,int messageId) { User user = this.userRepository.Get(userId); UserMessage message = this.messageRepository.Get(messageId); user.Message = message; //此处需要userRepository,messageRepository共享单一IRepositoryContext实例 //因为User和UserMessage不在同一上下文中的话,Entityframework会报异常。 this.userRepository.Update(user); this.context.Commit();//SaveChanges() } }
一直没搞清楚这一块,求高手说明