微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 如何使用Simple Injector注册命名实例

我正在开发一个WinForm应用程序,我正在使用Repository Pattern,我使用Servicestack Ormlite进行数据访问,使用Simple Injector进行IoC.

在我的program.cs中我有2个注册2个不同的OrmliteConnectionFactory但是目前我无法因为我无法注册命名…用FunQ我可以用

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

这是我的program.cs Bootstrap方法

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

提前致谢

解决方法

由于您有两个不同的数据库,每个数据库都有不同的模式,因此不同的OrmliteConnectionFactory不可互换.这意味着如果你交换它们,你的系统将停止工作.这表明你打破了 Liskov Substitution Principle.因此,在这种情况下的一般解决方案是为每个工厂提供自己的接口,并让每个存储库依赖于该特定接口.这允许您唯一地注册它们,让容器毫无疑问地解析对象图.

如果给每个工厂自己的抽象不是一种选择,或者方便,另一种选择是注册你的存储库而不需要自动连接.通过向委托人注册您的存储库,您可以完全控制注入存储库的内容.例如:

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

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

第三种选择是使用context based injection,如果您执行以下操作:

var f1 = Lifestyle.Singleton.CreateRegistration<IDbConnectionFactory>(
    () => new OrmliteConnectionFactory(
            conn1,ServiceStack.Ormlite.sqlServer.sqlServerOrmliteDialectProvider.Instance),container);

var f2 = Lifestyle.Singleton.CreateRegistration<IDbConnectionFactory>(
    () => new OrmliteConnectionFactory(
            conn2,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);

开箱即用Simple Injector不支持注册键控注册,但有几种方法可以执行此操作,如page所述.该页面还解释了为什么没有内置支持.这是一个深思熟虑的设计决定.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


原文地址:http://msdn.microsoft.com/en-us/magazine/cc163791.aspx 原文发布日期: 9/19/2005 原文已经被 Microsoft 删除了,收集过程中发现很多文章图都不全,那是因为原文的图都不全,所以特收集完整全文。 目录 前言 CLR启动程序
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采纳和使用,它的确提供了很多的优势也解决了很多的问题,但是我们也知道也并不是银弹,提供优势的同时它也给我们的开发人员和团队也带来了很多的挑战。 为了迎接或者采用这些新技术,开发团队需要更加注重一些流程或工具的使用,这样才能更好的适应这些新技术所
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下PLINQ中的分区。上一篇介绍了并行编程,这边详细介绍一下并行编程中的分区和自定义分区。 先做个假设,假设我们有一个200Mb的文本文件需要读取,怎么样才能做到最优的速度呢?对,很显然就是拆分,把文本文件拆分成很多个小文件,充分利用我们计算机中
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Microsoft为了利用这个硬件特性,于是在Visual Studio 2010 和 .NET Framework 4的发布及以上版本中,添加了并行编程这个新特性,我想它以后势必会改变我们的开发方式。 在以前或者说现在,我们在并行开发的时候可
c语言输入成绩怎么判断等级
字符型数据在内存中的存储形式是什么
c语言怎么求字符串的长度并输出
c语言函数的三种调用方式是什么
c语言中保留两位小数怎么表示
double的输入格式符是什么