servicestack,funq,C#,Inversion Of Control,servicestack,Funq" /> servicestack,funq,C#,Inversion Of Control,servicestack,Funq" />

C# 如何将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

如何将IDbConnectionFactory设置为在不继承服务时自动连接/注入

我创建了一些存储库类,这些存储库类将在另一个存储库类中使用,但不会从服务类继承。它看起来像这样:

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();
是的,我尝试了这两种方法,但没有成功,我更新了我的问题。谢谢。是的,你是对的,它没有实例化。那么我应该如何注册它呢?添加了另一个示例,说明在创建提供程序之前注册正确的类。