c# - 如何设置IDbConnectionFactory在不继承Service时 Autowiring /注入(inject)?

标签 c# inversion-of-control servicestack funq

如何设置IDbConnectionFactory在不继承Service时 Autowiring /注入(inject)?

我的一些存储库类将在另一个存储库类中使用,但不是从 Service 类继承。它看起来像这样:

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();
        }
    }
}

这是 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>()
});

然后,我使用这样的类:

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 类。如果在注册 UserControlSettingsRepository 之前调用 AuthExtended 构造函数,则不会解析该构造函数。在注册存储库之前,请检查 AppHost 的 Configure 方法,看看您是否正在创建提供程序。

下面是一个用于演示的快速 1 文件 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();
    }
}

下面是一个应用主机的示例,它注册数据库信息,然后验证身份验证提供程序:

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()}
        ));
    }
}

关于c# - 如何设置IDbConnectionFactory在不继承Service时 Autowiring /注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18828646/

相关文章:

redis - ServiceStack PooledRedisClientManager 故障转移如何工作?

c# - .NET Winforms c# 上传大文件

c# - 使用 Lazy<T> 对性能有害吗?

c# - Controller 中的 IoC 容器实现

c# - 依赖注入(inject)有什么大的改进?

servicestack.text 格式的缩进 json

c# - ServiceStack.Text 和 Twitter JSON

c# - 使用整数指针从 C# 调用外部 DLL

c# - 连接和/或合并两个通用列表中的对象

c# - StructureMap 创建实例