2

始める前に、次のように言います。ストアドプロシージャを呼び出しており、内部でのみ使用できるため、リポジトリを拡張する必要があります。多くの人はこれを知らないようですので、「DataContextを拡張しないでください」とは言わないでください。DataContextExecuteMethodCall

WindsorをIoCコンテナとして使い始めたところです。私のコントローラーは喜んで次のことを行います。

public ContractsControlController(IContractsControlRepository contractsControlService)
{
    _contractsControlRepository = contractsControlService;
}

しかし、私のリポジトリには次のコンストラクタが必要です。

public ContractsControlRepository()
  : base(ConfigurationManager.ConnectionStrings["AccountsConnectionString"].ToString()) { }

ただし、IoCコンテナは、web.configでリポジトリの接続文字列を指定できるようにするためのものです。これを行うには、リポジトリ内のコンストラクターはどのように見える必要がありますか?私が示したものを指定しないと、引数がゼロのコンストラクターがないと文句を言います。

乾杯

編集

global.asax.csで

ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory());

WindsorControllerFactory.cs(ルート内)

public class WindsorControllerFactory : DefaultControllerFactory
{
  WindsorContainer container;

  public WindsorControllerFactory()
  {
    container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle")));

    var controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes() where typeof(IController).IsAssignableFrom(t) select t;

    foreach (Type t in controllerTypes)
    {
      container.AddComponentLifeStyle(t.FullName, t, LifestyleType.Transient);
    }
  }

  protected IController GetControllerInstance(Type controllerType)
  {
    return (IController)container.Resolve(controllerType);
  }
}

しかし、containerweb.configに何も入っていない場合は必要ありませんか?

4

3 に答える 3

2

David Kemp の提案は簡潔ですが、型安全ではありません。より複雑ですが、タイプ セーフなアプローチは、ファクトリ メソッドを使用することです。

ContractsControlRepository クラスが、コンストラクターで接続文字列を受け取るように変更されたとします。その場合、次のように書くことができます。

var connectionString = 
    ConfigurationManager.ConnectionStrings
        ["AccountsConnectionString"].ConnectionString;

var container = new WindsorContainer();
container.AddFacility<FactorySupportFacility>();
container.Register(Component
    .For<IContractsControlRepository>()
    .UsingFactoryMethod(k => new ContractsControlRepository(connectionString)));

UsingFactoryMethod メソッドが機能する前に、FactorySupportFacility をコンテナに追加する必要があることに注意してください。

于 2009-11-09T14:03:31.230 に答える
1

この質問を見て、パラメーター コンストラクターを提供する方法を確認してください。

于 2009-11-09T13:53:08.940 に答える
0

これは次のように機能します。リポジトリを他のコンポーネントと同じように構成しますが、必要な接続文字列も構成のパラメーターとして提供します。

<component id="MyDataContext" service="yourservice" type="yourtype" lifestyle="singleton">
  <parameters>
    <connectionString>Data Source=localhost;Initial Catalog=YourCatalog;Integrated Security=SSPI</connectionString>
  </parameters>
</component>

次に、独自の DataContext のコンストラクターにパラメーターを追加します。その名前は connectionString です。

于 2009-11-22T00:34:56.120 に答える