代码之家  ›  专栏  ›  技术社区  ›  Chris Kooken

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

  •  0
  • Chris Kooken  · 技术社区  · 15 年前

    我有一节课:

     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>();
    

    它本身不调用单参数构造函数…而是得到一个错误:

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

    1 回复  |  直到 15 年前
        1
  •  0
  •   Matt Mills    15 年前

    可以重载特定混凝土的构造函数(这是Structuremap 2.6.2;不确定是早是晚):

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

    我将用我没有使用StructureMap进行泛型解析的语句来限定这一点,我不知道上面的代码将按原样编译。但估计你已经把你的映射编译好了。