@saxer

Как создать интерфейс который бы реализовывал в объекте его конструктор?

Как мне с помощью интерфейса реализовать конструктор в объекте?
Например у меня есть объект все методы которого используют идентификатор пользователя:
public interface ILogic
{
void Add(int userId);
void Change(int userId);
}

public class logic: ILogic
{
public void add(int userId)
{
....
}
public void change (int userId)
{
....
}
}


Логично определить конструктор в классе что бы при создании объекта запрашивать userId
public class logic
{
private int _userId;
public logic(int userId)
{
_userId = userId
}
public void add()
{
// ... делаем что либо используя _userId
}
public void change()
{
// ... делаем что либо используя _userId
}
}


Как мне изменить интерфейс что бы он учитывал что в классе его реализующем должен быть конструктор?
У меня возник этот вопрос при использовании ninject
Например у меня есть класс Order во всех его методах используется int userId (для реализации логирования).
  • Вопрос задан
  • 4900 просмотров
Решения вопроса 2
@dmitryKovalskiy
программист средней руки
Интерфейс это просто обещание класса, что он имеет "вот такие методы" с "вот такой сигнатурой". В чем ваша проблема? По идее:
public interface ILogic
{
void Add();
void Change();
}

А в конкретной реализации делай что хочешь, читай откуда хочешь.
что бы он учитывал что в классе его реализующем должен быть конструктор

В классе будет конструктор при любых раскладах. Классов без конструктора не бывает.
UPD: Примерно так. Код написан на колене и может иметь баги. Главное - идея)
public class someClass
{
private int _someParametr;
private someClass(){}
public static SomeClass CreateInstance(int inputParam)
{
var t = new SomeClass(){_someParametr = inputParam};
return t;
}
}

habrahabr.ru/post/235995 - Почитайте, может найдете полезные мысли.
Ответ написан
@saxer Автор вопроса
Отвечаю на свой собственный вопрос, может кому то в будущем пригодится.
Поскольку у меня была задача передавать в конструктор идентификатор пользователя то я реализовал это через httpContext, если нужно передавать что либо другое то думаю переделать особого труда не составит кому нужно, итак имеем интерфейс:
public interface IBidInterface
    {
        void AddBid(BidDto bidDto,List<GoodDto> goodDto);
    }


его реализация:
public class BidLogic : IBidInterface
    {
        private readonly xyzContext _context;
        private readonly User _user;

        public BidLogic(string userId)
        {
            _context = new xyzContext();
            _user = new ApplicationUserManager(new UserStore<User>(_context)).FindById(userId);
        }
        public void AddBid(BidDto bidDto, List<GoodDto> goodDto)
        {
           //...
        }


добавляем в NinjectDependencyResolver следующее:
private void AddBindings()
        {
            kernel.Bind<IBidInterface>().To<BidLogic>().WithConstructorArgument("userId",GetUser);
        }
        private static object GetUser(IContext context)
        {
            var httpContext = context.Kernel.Get<HttpContextBase>();
            if (httpContext != null && httpContext.Session != null)
            {
                var arg = httpContext.User.Identity.GetUserId();
                if (arg != null && !string.IsNullOrEmpty(arg))
                {
                    return arg;
                }
            }
            return null;
        }


все....теперь в конструктор будет передаваться значение userId
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@sergey_kzn
Делайте свойство в интерфейсе. Либо пишите абстрактный класс с нужными конструкторами и методами.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы