我正在开发一个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 举报,一经查实,本站将立刻删除。