Comments (3)
I used static method because I didn't know it's possible to constrain on arbitrary constructor, not only on unit -> ^a
. So, your solution is obviously better.
What about your main question, I really have no good ideas :( The best I managed to make is following:
module Settings =
let DB1ConnectionString = ""
let DB2ConnectionString = ""
let inline create connStr : ^a = (^a : (new : string -> ^a) connStr)
module DB1 =
type Command11 (connString: string) = class end
type Command12 (connString: string) = class end
let inline create() = create Settings.DB1ConnectionString
module DB2 =
type Command21 (connString: string) = class end
type Command22 (connString: string) = class end
let inline create() = create Settings.DB2ConnectionString
let cmd11 : DB1.Command11 = DB1.create()
let cmd12 : DB1.Command12 = DB1.create()
let cmd21 : DB2.Command21 = DB2.create()
let cmd22 : DB2.Command22 = DB2.create()
However, it's convention only. Nothing stops us to use wrong runtime connection strings :(
We need parameterized modules :) Or nested types :)
from fsharp.data.sqlclient.
Fixed in release 1.1.27.
In latest release command type gets static property called "ConnectionStringOrName" with value same as passed down to the type provider at design time. So now example of factory above can be update to
module Settings =
[<Literal>]
let DB1ConnectionString = ""
[<Literal>]
let DB2ConnectionString = ""
module SqlCommand =
type Command1 = SqlCommand<"SELECT * ...", DB1ConnectionString >
type Command2 = SqlCommand<"SELECT * ...", DB2ConnectionString >
let inline create() : 'a =
let designTimeConnectionString = (^a : (static member get_ConnectionStringOrName : unit -> string) ())
// i'll skip dot (.) int "ConnectionStrings.["DB1"]" because github code in-lining freaks out
let db1ConnStr = ConfigurationManager.ConnectionStrings["DB1"].ConnectionString
let db2ConnStr = ConfigurationManager.ConnectionStrings["DB2"].ConnectionString
match designTimeConnectionString with
| DB1ConnectionString -> (^a : (new : string -> ^a) db1ConnStr )
| DB2ConnectionString -> (^a : (new : string -> ^a) db2ConnStr )
| _ -> failwithf "Unrecognized command type %s" typeof<'a>.FullName
(*
or even
let database = SqlConnectionStringBuilder(designTimeConnectionString).InitialCatalog
if database = "AdventureWorks2012"
then
(^a : (new : string -> ^a) adventureWorks)
else failwithf "Unrecognized command type %s" typeof<'a>.FullName
*)
Feedback on this new feature is welcomed.
from fsharp.data.sqlclient.
@vasily-kirichenko How do you like this new design?
from fsharp.data.sqlclient.
Related Issues (20)
- Dacpac support info HOT 3
- "F# Formatting" link is broken
- Can't build/run from the commandline, but can from Visual Studio 2019 HOT 2
- Question: Creating a provider without an access to DB HOT 3
- SqlEnumProvider breaks VS 2019 HOT 2
- Not platform detection Fable HOT 1
- Build is broken without full VS installation
- Fixed length binary columns in user defined table types fail when constructed HOT 8
- Cannot use User Defined Table Types with the SqlCommandProvider HOT 5
- .NET 6 support HOT 6
- One line summary of the bug HOT 2
- TVP Column Ordering is incorrect as of version 2.1.0
- Cannot use parameter name more than once in a script HOT 3
- System.Data.SqlClient is not supported on this platform. HOT 5
- Conversion failed when using User Defined Table Types HOT 1
- Any 2023 tricks for running on Windows? HOT 3
- NullReferenceException in SqlConnection.UseLocally HOT 1
- Support for 'Active Directory Interactive' authentication HOT 3
- dotnet SDK projects using FSharp.Core version 7.0.0 breaks at runtime HOT 3
- SQL LIKE operation doesn't recognize variable HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from fsharp.data.sqlclient.