使用依赖注入和必需的默认构造函数

时间:2016-06-27 19:15:54

标签: c# entity-framework dependency-injection

我的类有一个构造函数,只需要一个配置对象,它返回我项目的默认连接字符串。

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

我仍然无法想到在注入依赖项时使用默认构造函数的方法。

2 个答案:

答案 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>