How to register a named instance with a simple injector

I am developing a WinForm application and I am using a repository template, I am using Servicestack OrmLite to access data and a simple injector for IoC.

In my program.cs, I have 2 registers 2 different OrmLiteConnectionFactory, but currently I can not, since I can not register named ... using FunQ. I can do it with

container.Register<IDbConnectionFactory>("db1", _ => new OrmLiteConnectionFactory(
    ConfigurationManager.ConnectionStrings["db1"].ConnectionString, 
    SqlServerDialect.Provider));
container.Register<IDbConnectionFactory>("db2", _ => new OrmLiteConnectionFactory(
    ConfigurationManager.ConnectionStrings["db2"].ConnectionString, 
    SqlServerDialect.Provider));

here is my program.cs bootstrap method

private static void Bootstrap()
{
    // Create the container as usual.
    Container = new Container();

    string conn1 = ConfigurationManager.ConnectionStrings["dbconn1"].ConnectionString;
    string conn2 = ConfigurationManager.ConnectionStrings["dbconn2"].ConnectionString;

    OrmLiteConnectionFactory connectionFactory = new OrmLiteConnectionFactory(conn1,
        ServiceStack.OrmLite.SqlServer.SqlServerOrmLiteDialectProvider.Instance); 
    Container.RegisterSingle<OrmLiteConnectionFactory>(connectionFactory1);

    OrmLiteConnectionFactory connectionFactory2 = new OrmLiteConnectionFactory(conn2,
        ServiceStack.OrmLite.SqlServer.SqlServerOrmLiteDialectProvider.Instance); 

    // how do I register this one without a name?
    Container.RegisterSingle<OrmLiteConnectionFactory>(connectionFactory2);

    Container.Register<MainForm>();
}

Thanks in advance

+4
source share
1 answer

, OrmLiteConnectionFactory . , , . , . , factory . - .

factory, , . , , . :

container.Register<IOrderRepository>(() => new SqlOrderRepo(connectionFactory1));

container.Register<IUserRepository>(() => new SqlUserRepo(
    connectionFactory2,
    container.GetInstance<ILogger>()));

: :

var f1 = Lifestyle.Singleton.CreateRegistration<IDbConnectionFactory>(
    () => new OrmLiteConnectionFactory(
            conn1,
            ServiceStack.OrmLite.SqlServer.SqlServerOrmLiteDialectProvider.Instance), 
        container);

var f2 = Lifestyle.Singleton.CreateRegistration<IDbConnectionFactory>(
    () => new OrmLiteConnectionFactory(
            conn2,
            ServiceStack.OrmLite.SqlServer.SqlServerOrmLiteDialectProvider.Instance), 
        container);

container.RegisterConditional(typeof(IDbConnectionFactory), f1, InjectedInto<SqlOrderRepo>);
container.RegisterConditional(typeof(IDbConnectionFactory), f2, InjectedInto<SqlUserRepo>);

// Helper method.
static bool InjectedInto<T>(PredicateContext c) =>
    c.Consumer.ImplementationType == typeof(T);

" " , , . , . .

+12

Source: https://habr.com/ru/post/1568286/


All Articles