首页 新闻 会员 周边

关于Autofac生命周期设置的问题?

0
悬赏园豆:10 [已关闭问题] 关闭于 2013-11-10 00:23

各位请看代码:

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()
    }
}
kaleyroy的主页 kaleyroy | 菜鸟二级 | 园豆:360
提问于:2013-10-15 23:00
< >
分享
所有回答(1)
0

一直没搞清楚这一块,求高手说明

onroader | 园豆:202 (菜鸟二级) | 2015-01-20 15:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册