StructureMap使用显式参数进行默认实例重载,错误205

时间:2010-10-06 17:07:15

标签: c# nhibernate dependency-injection structuremap ioc-container

我有一个班级:

 public class SystemQuery<T> : ISystemQuery<T> where T : class, IUIView {

    protected ISession session;
    protected ICriteria baseCriteria;

    public SystemQuery(SessionContext sessionContext) {
        this.session = sessionContext.Session;
        this.baseCriteria = session.CreateCriteria<T>();
    }

    public SystemQuery(SessionContext sessionContext, string newConnectionString)
    {
        var connection = new SqlConnection(newConnectionString);
        connection.Open();
        this.session = sessionContext.Session.SessionFactory.OpenSession(connection);
        this.baseCriteria = session.CreateCriteria<T>();
    }

StructureMap知道如何构建SessionContext,ISession和ICriteria。

在我的另一个课程中(我试图在这种情况下设置一个初始状态):

    public T BuildQuery<T>() where T: ISystemQuery {
        return container.GetInstance<T>();
    }

    public T BuildQuery<T>(string newConnectionString) where T: ISystemQuery
    {
        var dict = new Dictionary<string, object>();
        dict.Add("newConnectionString",newConnectionString);
        return container.GetInstance<T>(new ExplicitArguments(dict));
    }

问题是它在创建实例时调用

时不会重载构造函数
container.GetInstance<T>();

本身它不会调用单个参数构造函数......而是会出错:

StructureMap异常代码:205 缺少InstanceKey的请求实例属性“newConnectionString”“f4fea539-2b04-4067-9c1a-990516268cea”

1 个答案:

答案 0 :(得分:0)

您可以重载特定具体的构造函数(这是Structuremap 2.6.2;不确定更早或更晚):

ObjectFactory.Initialize(
    x => x.For<ISystemQuery>.Add<BuildQuery<T>>.Ctor<string>().Is(connectionString)
);

我将使用我没有使用StructureMap进行通用解析的语句对此进行限定,并且我不知道上面的代码将按原样编译。但据推测,你已经有了你的映射编译。