0

我已经注册了我的类型

Scan(
    scan => {
        scan.TheCallingAssembly();
        scan.WithDefaultConventions();
        scan.With(new ControllerConvention());
    });

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

string connStr = "...";
For<IRepository().Use<MyRepository>().Ctor<string>("connectionString").Is(connStr);
4

1 回答 1

1

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

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 获取它的,因此添加抽象来访问它无论如何都会有所帮助。

public interface IConfigurationSettingsReader
{
    string ReadConnectionString(string name);
    T ReadSetting<T>(string settingName);
}

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

public class MyRepository : IRepository
{
    private readonly string connectionString;

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

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

希望这可以帮助!

于 2015-02-02T16:28:00.500 回答