C# Autofac-在运行时解析参数
我有这个分层结构C# Autofac-在运行时解析参数,c#,dependency-injection,autofac,C#,Dependency Injection,Autofac,我有这个分层结构 namespace DataAccess public class SqlDataContext : ISqlDataContext { public SqlDataContext(string connectionString) { _connectionFactory = CreateConnection(connectionString); } } namespace Repositories public class U
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;
}
}
然后我像这样在Autofac容器中注册它
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>());
builder.Register((a,b)=>newsqldatacontext(b.Named(“connectionString”))
.As()
.InstancePerLifetimeScope();
builder.RegisterType()
.As()
.WithParameter((x,o)=>x.Name==“dataContext”,(x,o)=>o.Resolve());
builder.RegisterType()
.As()
.WithParameter((x,o)=>x.Name==“userRepository”,(x,o)=>o.Resolve());
然后我打电话给我的客户
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);
}
命名空间客户端
连接StringResolved()上的内部空洞{
var connectionString=GetConnectionString();
var dbContext=dependencyrolver.Instance().Resolve(
新名称参数(“connectionString”,connectionString)
);
var userRepository=
DependencyResolver.Instance().Resolve(
新命名参数(“dbContext”,dbContext)
);
_userManager=DependencyResolver.Instance().Resolve(
新名称参数(“userRepository”,userRepository)
);
var user=\u userManager.GetUser(userId);
}
我不想在我的客户端项目中引用DataAccess项目。但问题是ConnectionString只能在运行时解决
我在想我的客户的电话应该是这样的
_userManager = DependencyResolver.Instance().Resolve<IUserManager>(GetConnectionString());
\u userManager=dependencyrolver.Instance().Resolve(GetConnectionString());
有什么办法吗?为什么不创建一个可以在可接受点传入的选项接口?可能会有帮助。