Хотя у настоящих людей много обязанностей, вы направляетесь к анти-шаблону объекта Бога .
Как уже намекали другие, вы должны выделить эти обязанности в отдельные Репозитории и / или Доменные службы . Например:
SecurityService.Authenticate(credentials, customer)
OrderRepository.GetOrderHistoryFor(Customer)
RefundsService.StartRefundProcess(order)
Будьте конкретны с соглашениями об именах (т. Е. Используйте OrderRepository или OrderService вместо OrderManager )
Вы столкнулись с этой проблемой из-за удобства . то есть удобно рассматривать WebsiteUser
как совокупный корень и получать доступ ко всему через него.
Если вы сделаете больший акцент на ясности вместо удобства , это должно помочь разделить эти проблемы. К сожалению, это означает, что члены команды должны знать о новых Сервисах.
Еще один способ думать об этом: точно так же, как сущности не должны выполнять свою собственную постоянство (именно поэтому мы используем репозитории ), ваши WebsiteUser
не должен обрабатывать возврат / сегментацию и т. д.
Надеюсь, это поможет!
Что ж, насколько я могу судить, вот ваши проблемы:
StreamWriter
- неправильный выбор. Можно использовать обычную функцию записи потока. Это означает, что вы должны записывать данные в массив байтов вместо строки.
Вы конвертируете двоичные данные изображения в String64, браузер не знает об этом, по-прежнему думая, что это 32-битные данные.
Ваш формат кадра jpeg не соответствует верный. Вы также должны добавить Content-Length
в заголовок кадра, чтобы приложение, получающее поток, знало, когда прекратить чтение, вместо того, чтобы проверять следующую граничную строку при каждом чтении. Это приведет к ускорению чтения данных примерно в 4-5 раз. И в вашем символе новой строки также есть несоответствие, некоторые из них - «\ r \ n», а некоторые другие - «\ n».
Цикл while - это бесконечный цикл.
Итак, вот решение.
Примечание: могут быть некоторые синтаксические ошибки, но вы, вероятно, уловили общую идею.
private byte[] CreateHeader(int length)
{
string header =
"--" + BOUDARY + "\r\n" +
"Content-Type:image/jpeg\r\n" +
"Content-Length:" + length + "\r\n" +
+ "\r\n"; // there are always 2 new line character before the actual data
// using ascii encoder is fine since there is no international character used in this string.
return ASCIIEncoding.ASCII.GetBytes(header);
}
public byte[] CreateFooter()
{
return ASCIIEncoding.ASCII.GetBytes("\r\n");
}
private void WriteFrame(Stream st, Bitmap image)
{
// prepare image data
byte[] imageData = null;
// this is to make sure memory stream is disposed after using
using (MemoryStream ms = new MemoryStream())
{
image.Save(ms, ImageFormat.Jpeg);
imageData = ms.ToArray();
}
// prepare header
byte[] header = CreateHeader(imageData.Length);
// prepare footer
byte[] footer = CreateFooter();
// Start writing data
st.Write(header, 0, header.Length);
st.Write(imageData, 0, imageData.Length);
st.Write(footer, 0, footer.Length);
}
private void Render(Stream st)
{
for (int i = 0; i < imageset.Length; i++)
{
var resource = Properties.Resources.ResourceManager.GetObject(imageset[i]) as Bitmap;
WriteFrame(st, resource);
Thread.Sleep(500);
}
}