首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StructureMap3如何为所有类型配置构造函数字符串注入?

StructureMap3如何为所有类型配置构造函数字符串注入?
EN

Stack Overflow用户
提问于 2015-01-21 21:35:38
回答 1查看 69关注 0票数 0

我已经注册了我的类型

代码语言:javascript
复制
Scan(
    scan => {
        scan.TheCallingAssembly();
        scan.WithDefaultConventions();
        scan.With(new ControllerConvention());
    });

但是,如何指定构造函数注入,而不必指定这样的具体类型呢?

代码语言:javascript
复制
string connStr = "...";
For<IRepository().Use<MyRepository>().Ctor<string>("connectionString").Is(connStr);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-02 16:28:00

您可以创建专门的存储库注册约定。

代码语言:javascript
复制
public class RepositoryConvention : IRegistrationConvention
{
    private const string ConnectionString = "your connection string";

    public void Process(Type type, Registry registry)
    {
        if (type.IsConcrete() && type.GetInterfaces().Contains(typeof(IRepository)))
        {
            registry.For(typeof(IRepository))
                .Use(type)
                .CtorDependency<string>("connectionString")
                .Is(ConnectionString);
        }
    }
}

或创建专用类型以提供连接字符串。我敢打赌您是从web/app.config获得它的,所以添加访问它的抽象将是有帮助的。

代码语言:javascript
复制
public interface IConfigurationSettingsReader
{
    string ReadConnectionString(string name);
    T ReadSetting<T>(string settingName);
}

然后,您只需将其作为MyRepository的依赖项添加,而不需要在注册或使用自定义约定中显式地添加它。

代码语言:javascript
复制
public class MyRepository : IRepository
{
    private readonly string connectionString;

    public MyRepository(IConfigurationSettingsReader settingsReader)
    {
        this.connectionString = settingsReader.ReadConnectionString("ConnStrName");
    }
}

您可以考虑创建一个由每个存储库继承的抽象基存储库类,以摆脱安装bolerplate。

希望这能有所帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28077293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档