私はテスト目的でSimpleInjectorを使用していますが、OOPではかなり新しいものです。ゆるいカップルクラスを作成しようとしています。これが私のシナリオです。
私はこのようなユーザーリポジトリとインターフェースを持っています。
public class UserRepository:IUserRepository
{
public void Add(Model.User user)
{
Console.WriteLine("Name:"+user.Name+"\n"+"SurName:"+user.SureName);
}
public void Delete(int id)
{
throw new NotImplementedException();
}
}
public interface IUserRepository
{
void Add(User user);
void Delete(int id);
}
私のTestInjectedClass
クラスとインターフェースは、ProgrameMainで使用する予定のこのようなものです。
public class TestInjectedClass:ITestInjectedClass
{
private readonly IUserRepository _userRepository;
public TestInjectedClass(IUserRepository userRepository)
{
_userRepository = userRepository;
}
public void UserRepoRun()
{
var user = new User() {Id = 1,Name = "ada",SureName = "stack"};
_userRepository.Add(user);
}
}
public interface ITestInjectedClass
{
void UserRepoRun();
}
そして、私のコンソールプログラムは次のようになります。
class Program
{
static ITestInjectedClass _testInjectedClass;
private static IUserRepository _userRepository;
static void Main(string[] args)
{
_testInjectedClass= new TestInjectedClass(_userRepository);
_testInjectedClass.UserRepoRun();
Console.ReadLine();
}
public Program()
{
Bootstrap.Start();
}
}
ここのBootStrapクラス:
class Bootstrap
{
public static void Start()
{
var container = new Container();
// Register your types, for instance:
container.Register<IUserRepository, UserRepository>(Lifestyle.Singleton);
container.Register<ITestInjectedClass, TestInjectedClass>(Lifestyle.Singleton);
//container.Register<IUserRepository, TestInjectedClass>(Lifestyle.Singleton);
//container.Register<IUserContext, WinFormsUserContext>();
container.Register<TestInjectedClass>();
// Optionally verify the container.
container.Verify();
}
}
プログラムを実行すると、TestInjectionClass
内の_userRepository
で値の例外が発生します。 TestInjectionClass
とUserRepository
をメインプログラムに適切に注入するにはどうすればよいですか。ありがとう
Bootstrap.container
をProgram.Main
で使用できるようにしてから、コンストラクターを直接呼び出すのではなく、それを使用してクラスのインスタンスを作成する必要があります。
_testInjectedClass = Bootstrap.container.GetInstance<ITestInjectedClass>();
もちろん、それを機能させるには、Bootstrap
で公開する必要があります。
class Bootstrap
{
public static Container container;
public static void Start()
{
container = new Container();
// Register your types, for instance:
container.Register<IUserRepository, UserRepository>(Lifestyle.Singleton);
container.Register<ITestInjectedClass, TestInjectedClass>(Lifestyle.Singleton);
//container.Register<IUserRepository, TestInjectedClass>(Lifestyle.Singleton);
//container.Register<IUserContext, WinFormsUserContext>();
container.Register<TestInjectedClass>();
// Optionally verify the container.
container.Verify();
}
}
そして、Bootstrap.Start
からProgram.Main
を呼び出します。
static void Main(string[] args)
{
Bootstrap.Start();
_testInjectedClass = Bootstrap.container.GetInstance<ITestInjectedClass>();
_testInjectedClass.UserRepoRun();
Console.ReadLine();
}
問題は、Bootstrap
クラスインスタンスコンストラクターでProgram
コードを呼び出しているためです。
したがって、実際にプログラムを起動すると、実行環境はエントリポイントメソッドMain
を呼び出します。また、インスタンスコンストラクターは実行されません。
エントリポイントメソッドMain
と 'Bootstrap'クラスコードを変更してみてください。
static void Main(string[] args)
{
var container = new Container();
Bootstrap.Start(container);
_testInjectedClass = container.GetInstance<TestInjectedClass>();
_testInjectedClass.UserRepoRun();
Console.ReadLine();
}
class Bootstrap
{
public static void Start(Container container)
{
// Register your types, for instance:
container.Register<IUserRepository, UserRepository>(Lifestyle.Singleton);
container.Register<ITestInjectedClass, TestInjectedClass>(Lifestyle.Singleton);
container.Register<TestInjectedClass>();
// Optionally verify the container.
container.Verify();
}
}