仕事では、ServiceStackでいくつかの新しいWebサービスプロジェクトを実行しており、そのうちのいくつかでFunqを利用しています。私は現在、上記のWebサービスを使用する別のプロジェクトに取り組んでおり、プロジェクトでServiceStackのFunqを使用して、依存関係を解決し、多かれ少なかれ同じパターンを使用する方法があるかどうか疑問に思っていました。 Webサービスの開発。
これは可能ですか?
仕事では、ServiceStackでいくつかの新しいWebサービスプロジェクトを実行しており、そのうちのいくつかでFunqを利用しています。私は現在、上記のWebサービスを使用する別のプロジェクトに取り組んでおり、プロジェクトでServiceStackのFunqを使用して、依存関係を解決し、多かれ少なかれ同じパターンを使用する方法があるかどうか疑問に思っていました。 Webサービスの開発。
これは可能ですか?
ServiceStackには、コアに自己完結型の拡張バージョンのFunq(AutoWiringサポートなど)が含まれていますServiceStack.dll
。
残念ながら、現時点では、はServiceStack NuGetパッケージServiceStack.dll
に含まれており、他のServiceStackサーバーの依存関係をもたらします。NuGetパッケージのsrcまたはcherrypickから、必要なdllだけをビルドできます。
私は同様の立場にあり、webby 以外のプロジェクトで大量の ServiceStack ツールを使用したいと考えています。Funq のドキュメントに ... わずかな不足があることに同意します
元のプロジェクトを変更しないように (やりすぎ)、従来の WinForms アプリで使用しており、新しいフォームを新しいプロジェクトに追加しています。
ほとんどの ServiceStack ライブラリへの参照をほとんどのプロジェクトに追加しました (.Net 3.5 でこれを行っているため、手動で)
winformsProgram.cs
ファイルのコードは次のとおりです。これはパブリックな静的プロパティであることに注意してくださいFunqContainer
。まだよくわかりませんが、プロジェクト全体で FunqContainer にアクセスできます。
using System;
using System.Threading;
using System.Windows.Forms;
using Funq;
using MyApp.Utilities;
static class Program
{
public static Funq.Container FunqContainer { get; set; }
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
FunqContainer = new Container();
FunqContainer.Init();
etc...
}
}
FunqContainer.Init()
Funqを初期化するための私の別のプロジェクトの拡張メソッドです-あなたはそれを推測しました-
using System.Configuration; // Don't forget to ref System.Configuration.dll
using Funq;
using ServiceStack.OrmLite;
using ServiceStack.OrmLite.SqlServer;
namespace MyApp.Utilities
{
public static class FunqExtensions
{
public static void Init(this Container container)
{
//-------------------------------------------------------
// NB - I don't particularly like AutoWiring the public properties.
// Usually I want private stuff in the constructor)
//-------------------------------------------------------
var sqlServerConnectionString = ConfigurationManager.ConnectionStrings["HowdyCS"];
container.Register<IDbConnectionFactory>(
c => new OrmLiteConnectionFactory(
sqlServerConnectionString,
SqlServerOrmLiteDialectProvider.Instance));
container.Register<SomeForm>(
c => new SomeForm(
c.Resolve<IDbConnectionFactory>()
)
).ReusedWithin(ReuseScope.None);
}
}
}
登録時にラムダを使用するのが好きです。登録時ではなく、解決されるまでオブジェクトの構築を延期します。
デフォルトでは、コンテナーは解決されたオブジェクトをシングルトンとして保存しますが、使用するたびに初期化する必要があるもの (つまり、ユーザー コントロールまたは winforms ) がある場合は、.ReusedWithin(ReuseScope.None)
拡張機能を使用します。
必要な場所SomeForm
(つまり、ボタンのクリックなど)
...
private void btnOpenSomeForm_Click(object sender, EventArgs e)
{
var myForm = Program.FunqContainer.Resolve<SomeForm>();
myForm.Show();
}
詳細については、 http://blogs.clariusconsulting.net/kzu/mab-containermodel-funq-a-transparent-container/を確認してください
余談ですが、これはhttp://converter.telerik.com/を介して配置すると、VB.net でも機能します。