C# 如何将IDbConnectionFactory设置为在不继承服务时自动连接/注入?
如何将IDbConnectionFactory设置为在不继承服务时自动连接/注入 我创建了一些存储库类,这些存储库类将在另一个存储库类中使用,但不会从服务类继承。它看起来像这样:C# 如何将IDbConnectionFactory设置为在不继承服务时自动连接/注入?,c#,inversion-of-control,servicestack,funq,C#,Inversion Of Control,servicestack,Funq,如何将IDbConnectionFactory设置为在不继承服务时自动连接/注入 我创建了一些存储库类,这些存储库类将在另一个存储库类中使用,但不会从服务类继承。它看起来像这样: public class UsersControlSettingsRepository { //Property should be injected, but still null public IDbConnectionFactory Conn { get; set; } public U
public class UsersControlSettingsRepository
{
//Property should be injected, but still null
public IDbConnectionFactory Conn { get; set; }
public UsersControlSettings GetUsersSettings()
{
using (var _db = Conn.Conn.OpenDbConnection())
{
return _db.Select<UsersControlSettings>()
.OrderByDescending(u => u.Id).FirstOrDefault();
}
}
}
public class AuthExtended : CredentialsAuthProvider
{
private readonly Md5 _hashing;
private Users _user;
private UsersControlSettings _userSettings;
private readonly UsersRepository _userRepository;
private readonly UsersControlSettingsRepository _controlSettings;
public AuthExtended()
{
_hashing = new Md5();
_userSettings= EndpointHost.AppHost
.TryResolve<UsersControlSettingsRepository>();
}
公共类用户控制设置存储
{
//属性,但仍然为空
公共IDbConnectionFactory连接{get;set;}
公共用户控制设置GetUsersSettings()
{
使用(var _db=Conn.Conn.OpenDbConnection())
{
返回_db.Select()
.OrderByDescending(u=>u.Id).FirstOrDefault();
}
}
}
这是apphost配置:
var conn = new OrmLiteConnectionFactory(
ConfigurationManager.ConnectionStrings["BlaBla"].ConnectionString,
MySqlDialect.Provider);
container.Register<ICacheClient>(new MemoryCacheClient());
Container.RegisterValidators(typeof(MainServices).Assembly);
container.Register<IDbConnectionFactory>(c => conn);
container.Register(c => new UsersControlSettingsRepository()
{
Conn = c.TryResolve<IDbConnectionFactory>()
});
var conn=新的OrmLiteConnectionFactory(
ConfigurationManager.ConnectionString[“BlaBla”]。ConnectionString,
mysqldial.Provider);
Register(newmemorycacheclient());
容器.注册验证器(类型(主服务).装配);
容器寄存器(c=>conn);
Register(c=>newusersControlSettingsRepository()
{
Conn=c.TryResolve()
});
然后,我使用这样的类:
public class UsersControlSettingsRepository
{
//Property should be injected, but still null
public IDbConnectionFactory Conn { get; set; }
public UsersControlSettings GetUsersSettings()
{
using (var _db = Conn.Conn.OpenDbConnection())
{
return _db.Select<UsersControlSettings>()
.OrderByDescending(u => u.Id).FirstOrDefault();
}
}
}
public class AuthExtended : CredentialsAuthProvider
{
private readonly Md5 _hashing;
private Users _user;
private UsersControlSettings _userSettings;
private readonly UsersRepository _userRepository;
private readonly UsersControlSettingsRepository _controlSettings;
public AuthExtended()
{
_hashing = new Md5();
_userSettings= EndpointHost.AppHost
.TryResolve<UsersControlSettingsRepository>();
}
公共类AuthExtended:CredentialAuthProvider
{
私有只读Md5散列;
私人用户(u user),;
私有用户控制设置\u用户设置;
私有只读用户Repository\u userRepository;
私有只读用户控制设置存储控制设置;
公共授权扩展()
{
_哈希=新的Md5();
_userSettings=EndpointHost.AppHost
.TryResolve();
}
我在这里做错了什么吗?看看你的例子,我相信
AuthExtended
类是在你向容器注册各种类之前创建的。如果AuthExtended
构造函数是在注册UserControlSettingsRepository
之前调用的,它将不会被解析lved.在注册存储库之前,检查AppHost的配置
方法,查看是否正在创建提供程序
下面是一个快速的单文件ServiceStack控制台应用程序,用于演示:
public interface IFakeDbConnectionFactory
{
string Name { get; set; }
}
public class FakeDbConnectionFactory : IFakeDbConnectionFactory
{
public string Name { get; set; }
}
public class UsersControlSettingsRepository {
public IFakeDbConnectionFactory Conn { get; set; }
}
public class AppHost : AppHostHttpListenerBase
{
public AppHost() : base("Test App", typeof (AppHost).Assembly) {}
public override void Configure(Container container)
{
var conn = new FakeDbConnectionFactory { Name = "TestDB1"};
container.Register<IFakeDbConnectionFactory>(c => conn);
container.Register(c => new UsersControlSettingsRepository {
Conn = c.TryResolve<IFakeDbConnectionFactory>()
});
}
}
class Program
{
static void Main(string[] args)
{
var app = new AppHost();
app.Init();
app.Start(@"http://+:8085/");
var repo = EndpointHost.AppHost.TryResolve<UsersControlSettingsRepository>();
Console.WriteLine(repo.Conn.Name);
Console.ReadLine();
}
}
公共接口ifakedconnectionfactory
{
字符串名称{get;set;}
}
公共类FakeDbConnectionFactory:IFakeDbConnectionFactory
{
公共字符串名称{get;set;}
}
公共类用户控件设置存储{
公共ifakedConnectionFactory连接{get;set;}
}
公共类AppHost:AppHostHttpListenerBase
{
public AppHost():base(“测试应用程序”,typeof(AppHost).Assembly{}
公共覆盖无效配置(容器)
{
var conn=new-FakeDbConnectionFactory{Name=“TestDB1”};
容器寄存器(c=>conn);
container.Register(c=>newusersControlSettingsRepository{
Conn=c.TryResolve()
});
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var app=new AppHost();
app.Init();
app.Start(@“http://+:8085/”);
var repo=EndpointHost.AppHost.TryResolve();
控制台写入线(repo.Conn.Name);
Console.ReadLine();
}
}
下面是一个应用程序主机的示例,该主机注册数据库信息,然后注册身份验证提供商:
public class MyApphost : AppHostHttpListenerBase
{
public MyApphost() : base("Service Name", typeof(MyApphost).Assembly) {}
public override void Configure(Container container)
{
// Register database connection before creating a provider...
var conn = new OrmLiteConnectionFactory(ConfigurationManager.ConnectionStrings["BlaBla"].ConnectionString, MySqlDialect.Provider);
Container.Register<ICacheClient>(new MemoryCacheClient());
Container.RegisterValidators(typeof(MainServices).Assembly);
Container.Register<IDbConnectionFactory>(c => conn);
Container.Register(c => new UsersControlSettingsRepository() {
Conn = c.TryResolve<IDbConnectionFactory>()
});
// Setup authentication
Plugins.Add(new AuthFeature(
() => new AuthUserSession(),
new IAuthProvider[] { new CustomCredentialsAuthProvider()}
));
}
}
公共类MyApphost:AppHostHttpListenerBase
{
public MyApphost():base(“服务名称”,typeof(MyApphost).Assembly{}
公共覆盖无效配置(容器)
{
//在创建提供程序之前注册数据库连接。。。
var conn=新的OrmLiteConnectionFactory(ConfigurationManager.ConnectionString[“BlaBla”].ConnectionString,mysqldialent.Provider);
Register(newmemorycacheclient());
容器.注册验证器(类型(主服务).装配);
容器寄存器(c=>conn);
Register(c=>newusersControlSettingsRepository(){
Conn=c.TryResolve()
});
//设置验证
添加(新的AuthFeature)(
()=>新建AuthUserSession(),
新建IAuthProvider[]{new CustomCredentialsAuthProvider()}
));
}
}
您是如何创建用户控制设置还原的
?如果您刚刚创建了一个,那么您将不会注入任何内容,您应该使用容器来解析它。即EndpointHost.AppHost.TryResolve();
是的,我尝试了这两种方法,但没有成功,我更新了我的问题。谢谢。是的,你是对的,它没有实例化。那么我应该如何注册它呢?添加了另一个示例,说明在创建提供程序之前注册正确的类。