可以将第二个参数传递给Controller构造函数吗?

时间:2014-01-31 23:04:03

标签: constructor controller repository castle-windsor asp.net-web-api-routing

Castle Windsor将注册的具体类型传递给Controller的构造函数。一个典型的实现(没有双关语)是:

private readonly IDepartmentRepository _deptsRepository;

public DepartmentsController(IDepartmentRepository deptsRepository)
{
    if (deptsRepository == null)
    {
        throw new ArgumentNullException("deptsRepository");
    }
    _deptsRepository = deptsRepository;
}

我需要传递ctor第二个参数,如果可能的话,这样我就可以将val传递给Repository构造函数(我知道:tramp数据警报,但我不知道是否有一种直接的方法:

public DepartmentsController(IDepartmentRepository deptsRepository, int DBInstance)
{
    if (deptsRepository == null)
    {
        throw new ArgumentNullException("deptsRepository");
    }
    _deptsRepository = deptsRepository(DBInstance);
}

REPOSITORY

public DepartmentRepository(int dbInst)
{
    string connStr = string.Format("Phoo{0}Bar", dbInst);
    using (var conn = new OleDbConnection(connStr))
    {
        using (var cmd = conn.CreateCommand())
        {
             . . .

是否可以通过这种方式调整Castle Windsor发送给Controller构造函数的内容?如果是这样,怎么样?

AND / BUT:为了具有任何价值(无论如何),我需要能够从客户端发送的URL获取int val(将传递给Controller)。 IOW,如果客户端通过以下方式向服务器请求数据:

http://locohost:4242/Platypus/GetAll/1

我需要传递一个“1”作为PlatypusController的第二个参数。

如果用户通过以下方式向服务器请求数据:

http://locohost:4242/Platypus/GetAll/42

我需要传递一个“42”作为PlatypusController的第二个参数。

1 个答案:

答案 0 :(得分:0)

这就是我为解决我的Controller / Repository数据上下文困境所做的工作:

0)向Controller的路由属性添加了数据库上下文参数。 IOW,这个:

[Route("api/HHSUsers/GetAll")]

......改变了这个:

[Route("api/HHSUsers/GetAll/{dbContext=03}")]

1)将该数据库上下文arg传递给Repository。也就是说,这个:

return _hhsusersrepository.GetAll();

......改变了这个:

return _hhsusersrepository.GetAll(dbContext);

...以便Controller方法现在是:

[Route("api/HHSUsers/GetAll/{dbContext=03}")]
public IEnumerable<HHSUsers> GetAllHHSUsersRecords(int dbContext)
{
    return _hhsusersrepository.GetAll(dbContext);
}

2)从以下位置更改了Repository接口中的相应方法:

IEnumerable<HHSUsers> GetAll();

......对此:

IEnumerable<HHSUsers> GetAll(string dbContext);

3)改变了Repository方法:

public HHSUsersRepository()
{
    // All the data is loaded here in the ctor
}

public IEnumerable<HHSUsers> GetAll()
{
    return hhsusers;
}

....对此:

public IEnumerable<HHSUsers> GetAll(string dbContext)
{
    LoadHHSUsers(dbContext);
    return hhsusers;
}

private void LoadHHSUsers(int dbContext)
{
    string connStr = string.Format("Foo{0}Bar", dbContext);
    // The same as previously from this point on, except that this:
    // using (var conn = new OleDbConnection(@"Foo Bar Phoo Bar etc"...
    // becomes:
    // using (var conn = new OleDbConnection(connStr))

4)在调用方法时将dbcontext val粘贴到URL的末尾,这样就是这样:

http://localhost:28642/api/HHSUsers/GetAll/42

......而不是:

http://localhost:28642/api/HHSUsers/GetAll

如果要使用的数据上下文是&#34; 03&#34;我可以从URL中省略dbcontext arg,因为03是我在附加&#34; = 03&#34;时设置的默认值。到Controller&#34; dbContext&#34;路由属性arg。

我知道一些花哨的螺旋桨头会因某种原因而对此有所挑剔(原因之一是因为流浪汉数据在这里和那里到处都像类固醇上的流浪汉一样),但我的回答与此相同一名运动员正在遭到对方球员的喋喋不休,而他的球队正在赢得胜利:只需指向记分牌。 IOW,这对我有用,所以我非常关心。风格点适用于跑道模特,而且还有花式裤子螺旋桨头(AKA Star-Bellied Sneeches)(与我们平原相对) 没有明星肚子的猫));看&#34; 完美是好的敌人。&#34;

这种简单的方法具有自我相同的好处 - 可以(相对)简单地理解,因此可以根据需要进行修改/重构。不雅?当然,但是Joe Kapp也是如此。