Jestem początkującym, jeśli chodzi o DI i ninject i mam trochę problemów z o tym, kiedy powinien nastąpić właściwy zastrzyk i jak rozpocząć wiązanie .Ninject - jak i kiedy wstrzyknąć
Używam go już w mojej aplikacji internetowej i działa dobrze tam, , ale teraz chcę użyć wtrysku w bibliotece klas.
że mam klasa tak:
public class TestClass
{
[Inject]
public IRoleRepository RoleRepository { get; set; }
[Inject]
public ISiteRepository SiteRepository { get; set; }
[Inject]
public IUserRepository UserRepository { get; set; }
private readonly string _fileName;
public TestClass(string fileName)
{
_fileName = fileName;
}
public void ImportData()
{
var user = UserRepository.GetByUserName("myname");
var role = RoleRepository.GetByRoleName("myname");
var site = SiteRepository.GetByID(15);
// Use file etc
}
}
chcę użyć zastrzyk nieruchomości tutaj, bo muszę przechodzić w pliku w moim konstruktora. Czy mam rację, mówiąc, że jeśli potrzebuję przejść przez parametr konstruktora, nie mogę użyć iniekcji konstruktora? Jeśli mogę użyć iniekcji konstruktora z dodatkowymi parametrami, w jaki sposób przekazuję te parametry?
Mam app konsoli, który zużywa o klasie test, który wygląda jak następująco:
class Program
{
static void Main(string[] args)
{
// NinjectRepositoryModule Binds my IRoleRepository etc to concrete
// types and works fine as I'm using it in my web app without any
// problems
IKernel kernel = new StandardKernel(new NinjectRepositoryModule());
var test = new TestClass("filename");
test.ImportData();
}
}
Moim problemem jest to, że gdy zgłoszę test.ImportData()
moje repozytoria są nieważne - nie został wstrzyknięty do nich. Próbowałem tworzenia kolejnego modułu i nazywając
Bind<TestClass>().ToSelf();
jak myślałem, że to może rozwiązać wszystkie właściwości wtrysku w TestClass
ale mam donikąd.
Jestem pewien, że jest to banalny problem, ale po prostu nie mogę się dowiedzieć, jak to zrobić.
Wydaje się działać przy użyciu jądra.Inject (test). Dzięki. Z ciekawości kolejne pytanie - Jestem w nowej wersji TestClass, ponieważ muszę przekazać ciąg znaków do konstruktora. Czy istnieje sposób przekazywania parametru przy użyciu jądra.Get()? –
Tak - są przeciążenia Get i możesz je również umieścić w Bindie –
Generalnie lepszym rozwiązaniem w miejsce hardwiringa jest to, co wymaga konstruktora arg, zamiast tego odwołuj się do obiektu confuigurator, który jesteś nowy, a następnie Bind podczas tworzenia modułu –