代码之家  ›  专栏  ›  技术社区  ›  Linc Abela

Autofac-在运行时解析参数

  •  0
  • Linc Abela  · 技术社区  · 8 年前

    我有这个分层结构

    namespace DataAccess 
    
    public class SqlDataContext : ISqlDataContext
    {
        public SqlDataContext(string connectionString)
        {
            _connectionFactory = CreateConnection(connectionString);
        }
    }
    
    
    namespace Repositories
    
    public class UserRepository : IUserRepository
    {
        public UserRepository(ISqlDataContext dataContext)
        {
            _db = dataContext;
        }
    }
    
    namespace Core
    
    public class UserManager :IUserManager
    {
        public UserManager(UserRepository repository)
       {
            _userRepository = repository;
        }
    }
    

            builder.Register((a, b) => new SqlDataContext(b.Named<string>("connectionString")))
                .As<ISqlDataContext>()
                .InstancePerLifetimeScope();
    
            builder.RegisterType<UserRepository>()
                .As<IUserRepository>()
                .WithParameter((x, o) => x.Name == "dataContext", (x, o) => o.Resolve<ISqlDataContext>());
    
            builder.RegisterType<UserManager>()
                .As<IUserManager>()
                .WithParameter((x, o) => x.Name == "userRepository", (x, o) => o.Resolve<IUserRepository>());
    

    然后我打电话给我的客户

          namespace Client
    
         internal void OnConnectionStringResolved() {
    
            var connectionString = GetConnectionString();
    
            var dbContext = DependencyResolver.Instance().Resolve<ISqlDataContext>(
                new NamedParameter("connectionString", connectionString)
                );
    
             var userRepository = 
                 DependencyResolver.Instance().Resolve<IUserRepository>(
                new NamedParameter("dbContext", dbContext)
                );
    
            _userManager = DependencyResolver.Instance().Resolve<IUserManager>(
                new NamedParameter("userRepository", userRepository)
                );
    
           var user = _userManager.GetUser(userId);
         }
    

    我不想在我的客户端项目中引用DataAccess项目。但问题是ConnectionString只能在运行时解决。

    我在想我的客户的电话应该是这样的

           _userManager = DependencyResolver.Instance().Resolve<IUserManager>(GetConnectionString());
    

    0 回复  |  直到 8 年前
    推荐文章