var connString = ConfigurationManager.AppSettings["MONGOHQ_URL"];
var databaseName = connString.Split('/').Last();
var server = MongoServer.Create(connString);
var database = server.GetDatabase(databaseName);
if (!database.CollectionExists("Messages"))
database.CreateCollection("Messages");
container.Register<MongoServer>(server);
container.Register<MongoDatabase>(database);
container.Register<MongoCollection<Message>>(database.GetCollection<Message>("Messages"));
AppSettiongs appSettings = new AppSettings();
container.Register<IMyMongoDbManager>(c => new MyMongoDbManager(appSettings.Get<List<MongoDbConfig>>("MongoDbConfigs")));
[RestService("/users/{ShardId}/{Id}")]
class MyShardedRequest {
public string ShardId { get; set; }
public string Id { get; set; }
}
class MyShardedRequestService : ServiceBase<MyShardedRequest> {
public IMyMongoDbManager MongoManager { get; set; }
public object Run(MyShardedRequest request) {
var mongoUsers = MongoManager.GetDbCollection<User>(request.ShardId);
var user = mongoUsers.FindOne(Query.EQ("_id", ObjectId.Parse(request.Id)));
...
}
}
There really is nothing magical about Funq - whatever you register gets injected into your services in the lifetime policy you chose.
So it's just basic C# from there, if you don't know what Mongo DB you need to return until runtime, then I'd just register a custom factory that lets a service pass in a shard Id and then the Factory just returns the appropriate db and collection for that shard, something like:
AppHost:AppSettiongs appSettings = new AppSettings();
container.Register<IMyMongoDbManager>(c => new MyMongoDbManager(appSettings.Get<List<MongoDbConfig>>("MongoDbConfigs")));Service:[RestService("/users/{ShardId}/{Id}")]
class MyShardedRequest {
public string ShardId { get; set; }
public string Id { get; set; }
}
class MyShardedRequestService : ServiceBase<MyShardedRequest> {
public IMyMongoDbManager MongoManager { get; set; }
public object Run(MyShardedRequest request) {
var mongoUsers = MongoManager.GetDbCollection<User>(request.ShardId);
var user = mongoUsers.FindOne(Query.EQ("_id", ObjectId.Parse(request.Id)));
...
}
}