вот конечная цель: получить новое соединение от фабрики по имени, например, так: factory.CreateConnection<SqlConnection>("my db")
Вот мой код:
type IConnectionFactory =
abstract member CreateConnection : unit -> IDbConnection
type DefaultConnectionFactory<'t when 't : (new : unit -> 't) and 't :> IDbConnection> () =
member this.CreateConnection () = new 't()
interface IConnectionFactory with
member this.CreateConnection () = this.CreateConnection() :> IDbConnection
type DefaultConnectionFactoryFactory() =
member this.CreateConnectionFactory connectionType =
if not (typeof<IDbConnection>.IsAssignableFrom connectionType)
then invalidArg "connectionType" (sprintf "type %O is not assignable to IDbConnection" connectionType)
let genericFactoryType = typedefof<DefaultConnectionFactory<_>>
let factorytype = genericFactoryType.MakeGenericType([| connectionType |])
Activator.CreateInstance(factorytype) :?> IConnectionFactory
type ConnectionFactory (connectionStrings : Dictionary<string, (IConnectionFactory * string)>) =
let ConnectionStrings = connectionStrings
member this.CreateConnection connectionStringName : 't :> IDbConnection =
if ConnectionStrings.ContainsKey connectionStringName
then
let connectionFactory, connectionString = ConnectionStrings.Item connectionStringName
let connection = connectionFactory.CreateConnection ()
connection.ConnectionString <- connectionString
connection :?> 't
else invalidArg "dataSourceName" (sprintf "no data source found named %s" connectionStringName)
в этой строке:
let genericFactoryType = typedefof<DefaultConnectionFactory<_>>
Я получаю эту ошибку: Несоответствие ограничения типа при применении типа по умолчанию 'IDbConnection' для переменной вывода типа.Общая конструкция требует, чтобы у типа 'IDbConnection' был общедоступный конструктор по умолчанию. Рассмотрите возможность добавления дополнительных ограничений типов
Я не уверен, как ее разрешить ... Любые другие предложения также приветствуются