我的类有一个构造函数,只需要一个配置对象,它返回我项目的默认连接字符串。
public AllMidContext(IConfigurationAccess configAccess)
: base(configAccess.GetDefaultConnectionString())
{}
当我尝试更新数据库时,实体框架会抱怨,因为它需要一个默认构造函数(没有参数)。
我正在使用Structure map,我的配置代码如下所示:
public class GAPDLRegistry : Registry
{
public GAPDLRegistry()
{
For<IAllMidContext>().Use<AllMidContext>();
For<IDataContextAccess>().Use<DataContextAccess>();
For<IConfigurationAccess>().Use<ConfigurationAccess>();
For<ITournamentRepository>().Use<TournamentRepository>();
}
}
我仍然无法想到在注入依赖项时使用默认构造函数的方法。
答案 0 :(得分:0)
将此来源添加到您的代码中
public AllMidContext() : base(ConfigAccess.GetDefaultConnectionString())
{}
[Inject]
public IConfigurationAccess ConfigAccess
{
get;
set;
}
答案 1 :(得分:0)
你实际上并不需要DI。
EntityFramework使用IDbConnectionFactory的实例来允许从配置文件加载连接字符串。因此,在您的应用程序配置文件中,您应该有一个这样的元素:
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
如果您的数据库是SQL Server数据库,只需查看SqlConnectionFactory并在配置文件中使用它。
否则,您可以创建一个单独的类并将其用作连接工厂:
public class CustomConnectionFactory : IDbConnectionFactory
{
public CustomConnectionFactory(string connectionStringName)
{
_connectionStringName = connectionStringName;
}
public DbConnection CreateConnection(string nameOrConnectionString)
{
var connectionString = ConfigurationManager.ConnectionStrings[_connectionStringName].ConnectionString;
return new SqlConnection(connectionString);
}
}
您可以在配置文件中使用它:
<connectionStrings>
<add name="ApplicationDB" connectionString="..." />
</connectionStrings>
<defaultConnectionFactory type="Your.Class.Namespace.CustomConnectionFactory, YourAssemblyName">
<parameters>
<parameter value="ApplicationDb" />
</parameters>
</defaultConnectionFactory>